zoukankan      html  css  js  c++  java
  • Sightseeing,题解

    题目:

      

      

      

    题意:

      找到从s到t与最短路长度相差少于1的路径总数。

    分析:

      首先,搞明白题意之后,我们来考虑一下怎么处理这个1,怎样找相差为1的路径呢?我们这样想,如果有相差为1的路径,那么它将会是严格的次短路,所以我们可以再跑最短路的时候顺带着跑了次短路(严格的),然后判断一下和最短路是不是相差一然后就计算一下就好了,当然,这个的时间复杂度其实就是常数大了的E*logE的,所以时间复杂度是没问题的,然后就是代码:

      

    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int maxn=(1e3)*2+10;
    const int maxm=1e5+10;
    struct E{
        int to;
        int next;
        int val;
    }ed[maxm];
    int tot;
    int head[maxn];
    void J(int a,int b,int c){
        tot++;
        ed[tot].to=b;
        ed[tot].val=c;
        ed[tot].next=head[a];
        head[a]=tot;
    }
    struct Node{
        int dis;
        int x;
        int ci;
        friend bool operator < (Node a,Node b){
            return a.dis>b.dis;
        }
        Node(int a,int b,int c){
            x=a;
            dis=b;
            ci=c;
        }
    };
    priority_queue<Node> qu;
    bool vis[maxn][2];
    int cot[maxn][2];
    int dis[maxn][2];
    int main(){
        int t;
        scanf("%d",&t);
        for(int jsjs=1;jsjs<=t;jsjs++){
            memset(head,0,sizeof(head));
            tot=0;
            memset(vis,0,sizeof(vis));
            memset(cot,0,sizeof(cot));
            memset(dis,0x3f,sizeof(dis));
            int n,m;
            scanf("%d%d",&n,&m);
            int js1,js2,js3;
            for(int i=1;i<=m;i++){
                scanf("%d%d%d",&js1,&js2,&js3);
                J(js1,js2,js3);
            }
            int s,q;
            scanf("%d%d",&s,&q);
            dis[s][0]=0;
            cot[s][0]=1;
            qu.push(Node(s,0,0));
            while(!qu.empty()){
                Node js=qu.top();
                qu.pop();
                if(vis[js.x][js.ci])
                    continue;
                vis[js.x][js.ci]=1;
                for(int i=head[js.x];i;i=ed[i].next){
                    int to=ed[i].to;
                    int di=js.dis+ed[i].val;
                    if(dis[to][0]>di){
                        dis[to][1]=dis[to][0];
                        dis[to][0]=di;
                        cot[to][1]=cot[to][0];
                        cot[to][0]=cot[js.x][js.ci];
                        qu.push(Node(to,dis[to][0],0));
                        qu.push(Node(to,dis[to][1],1));
                        continue;
                    }
                    if(dis[to][0]==di){
                        cot[to][0]+=cot[js.x][js.ci];
                        continue;
                    }
                    if(dis[to][1]>di){
                        dis[to][1]=di;
                        cot[to][1]=cot[js.x][js.ci];
                        qu.push(Node(to,dis[to][1],1));
                        continue;
                    }
                    if(dis[to][1]==di){
                        cot[to][1]+=cot[js.x][js.ci];
                        continue;
                    }
                }
            }
            printf("%d
    ",cot[q][0]+(dis[q][1]==dis[q][0]+1?cot[q][1]:0));
        }
        return 0;
    }
  • 相关阅读:
    介绍一款能取代 Scrapy 的 Python 爬虫框架
    盘点 Django 展示可视化图表的多种方式(建议收藏)
    阿里最强 Python 自动化工具开源了!
    推荐一款小众且好用的 Python 爬虫库
    该死的端口占用!教你用 Shell 脚本一键干掉它!
    字节跳动实习面经分享(已拿offer附攻略)
    这样给小白讲原码、反码、补码,帮她彻底解决困扰了三天的问题
    并查集是一种怎样的数据结构?
    约瑟夫环问题的三种解法,一文搞定
    数据结构:栈详解
  • 原文地址:https://www.cnblogs.com/wish-all-ac/p/12952609.html
Copyright © 2011-2022 走看看