• POJ 3463


      题目意思就是要求s到t的最短路径个数和s到t的次短路径个数。

     参考了大佬的博客

    #include<iostream>
    #include<string.h>
    #include<queue>
    #include<stdio.h>
    using namespace std;
    #define inf 0x3f3f3f3f
    int n,m,en,st,et;
    int head[1010];
    int dis[1010][2];
    int cnt[1010][2];
    int vis[1010][2];
    struct edge
    {
        int from,to;
        int dis;
        int next;
    }edge[10005];
    struct node
    {
        int v;
        int flag;
        node(int a,int b)
        {
            v=a;
            flag=b;
        }
    
    
    };
    struct cmp
    {
        bool operator()(struct node a,struct node b)
        {
    
            return dis[a.v][a.flag]>dis[b.v][b.flag];    //表示按结构体变量里的x成员为比较要素,升序排列
        }
    };
    int dijkstra()
    {
        memset(vis,0,sizeof(vis));
        memset(cnt,0,sizeof(cnt));
        for(int i=1;i<=n;i++)
            dis[i][0]=dis[i][1]=inf;
        priority_queue<struct node,vector<struct node>,cmp>q;
        q.push(node(st,0));
        dis[st][0]=0;
        cnt[st][0]=1;
        while(!q.empty())
        {
            node top=q.top();
            q.pop();
            int v=top.v;
            int flag=top.flag;
            if(vis[v][flag])
                continue;
            vis[v][flag]=1;
            for(int i=head[v];i!=-1;i=edge[i].next)
            {
                int to=edge[i].to;
                int dist=dis[v][flag]+edge[i].dis;
                if(dist<dis[to][0])
                {
                    if(dis[to][0]!=inf)
                    {
                        dis[to][1]=dis[to][0];
                        cnt[to][1]=cnt[to][0];
                        q.push(node(to,1));
                    }
                    dis[to][0]=dist;
                    cnt[to][0]=cnt[v][flag];
                    q.push(node(to,0));
                }
                else
                    if(dist==dis[to][0])
                        cnt[to][0]+=cnt[v][flag];
                else
                    if(dist<dis[to][1])
                    {
                        dis[to][1]=dist;
                        cnt[to][1]=cnt[v][flag];
                        q.push(node(to,1));
    
                    }
                    else
                        if(dist==dis[to][1])
                        {
                            cnt[to][1]+=cnt[v][flag];
    
                        }
    
    
            }
        }
        if(dis[et][0]+1==dis[et][1])
            return cnt[et][0]+cnt[et][1];
        return cnt[et][0];
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            en=0;
            memset(head,-1,sizeof(head));
            scanf("%d%d",&n,&m);
            while(m--)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                edge[en].from=a;
                edge[en].to=b;
                edge[en].dis=c;
                edge[en].next=head[a];
                head[a]=en;
                en++;
            }
            scanf("%d%d",&st,&et);
            printf("%d
    ",dijkstra());
        }
        return 0;
    }
  • 相关阅读:
    python高级函数六剑客
    测试工程师用到常用的git命令
    qing理解赋值,深浅拷贝的区别
    python设计模式之单例
    Python全栈之jQuery笔记
    畅谈python之单元测试框架-unittest
    浅析python之单元测试框架-unittest
    Python之日志处理(logging模块)
    Spring整理
    Spark学习笔记11面向对象编程
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755050.html
Copyright © 2020-2023  润新知