• poj 2363 Sightseeing ( 找次短路和最短路的条数 )


    http://poj.org/problem?id=3463

    题意 给出一个图 若次短路比最短路多1 则输出 最短路的条数+次短路的条数

    否则输出 最短路的条数

    #include<iostream>
    #include<stdio.h>
    #include<queue>
    #include<string.h>
    using namespace std;
    #define INF 100000000
    
    
    struct E{int to;int next;int len;}edge[20004];
    int vis[1014][2],d[1012][2],dp[1012][2],adj[1002],num;
    
    
    void dij(int s,int n)
    {
        int i,j,flag;
        memset(vis,0,sizeof(vis));
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
            d[i][0]=d[i][1]=INF;
        d[s][0]=0; dp[s][0]=1; //vis[s][0]=1;
        for(i=1;i<2*n;i++)
        {
            int minn=INF,a,b;
            for(j=1;j<=n;j++)
            {
                if(!vis[j][0]&&minn>d[j][0])
                {
                    minn=d[j][0]; a=j; flag=0;
                }
                if(!vis[j][1]&&minn>d[j][1])
                {
                    minn=d[j][1]; a=j;flag=1;
                }
                
            }
            if(minn==INF)
                    break;
                vis[a][flag]=1;
            //printf("ok");
    
                for(j=adj[a];j!=0;j=edge[j].next )
                {
                    b=edge[j].to ; int v=edge[j].len;
                    if(d[a][flag]+v<d[b][0])
                    {
                        d[b][1]=d[b][0];
                        dp[b][1]=dp[b][0];
                        d[b][0]=minn+v;
                        dp[b][0]=dp[a][flag];
                    }
                    else if(minn+v==d[b][0])
                        dp[b][0]+=dp[a][flag];
                    else if(minn+v<d[b][1])
                    {
                        d[b][1]=d[a][flag]+v;
                        dp[b][1]=dp[a][flag];
                    }
                    else if(d[a][flag]+v==d[b][1])
                        dp[b][1]+=dp[a][flag];
                }
        }
    }
    
    void add(int a,int b,int c)
    {
        edge[num].to =b;
        edge[num].next =adj[a];
        edge[num].len=c;
        adj[a]=num++;
    }
        
    int main()
    {
        int i,j,m,n,t,a,b,c,s,e;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            memset(adj,0,sizeof(adj));
            num=1;
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
            }
            scanf("%d%d",&s,&e);        
            dij(s,n);
            if(d[e][0]+1==d[e][1])
                dp[e][0]+=dp[e][1];
             
            printf("%d
    ",dp[e][0]);
        
        }
        return 0;
    }
  • 相关阅读:
    算法提高---概率计算
    全排列
    算法提高 最小方差生成树
    【洛谷】P1040 加分二叉树
    SPAF模板
    Bellman-Ford算法(有向图)
    Floyd算法
    Dijkstra算法
    蓝桥杯算法提高 递推求值 【矩阵快速幂】
    【动态规划】数字分组I
  • 原文地址:https://www.cnblogs.com/assult/p/3228470.html
Copyright © 2020-2023  润新知