zoukankan      html  css  js  c++  java
  • P1608 路径统计

    最短路计数,含重边。

    ————————————————

    真事坑人,而且窝也好久没有做图论题了,尴尬

    注意cnt清零

    ————————————————————————————————

    #include<bits/stdc++.h>
    using namespace std;
    #define setfax(x) memset(x,0x3f,sizeof(x));
    #define setfin(x) memset(x,0,sizeof(x));
    int n,m,ne,head[2050],a,b,c,dis[2050],f[2050],vist[2050],dk[2020][2020];
    queue<int>q;
    struct node {int to,dis,nxt;}eg[4000100]; 
    void adde(int u,int v,int c) { eg[++ne].to=v; eg[ne].dis=c; eg[ne].nxt=head[u]; head[u]=ne; } 
    void spfa()
    {
        setfax(dis);setfin(vist);
        q.push(1);
        vist[1]=1;
        dis[1]=0;
        f[1]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();vist[u]=0;if(u==n)continue;
            for(int i=head[u];i;i=eg[i].nxt)
            {    int v=eg[i].to;
                
                if(dis[v]>=eg[i].dis+dis[u]){if(dis[v]==eg[i].dis+dis[u])f[v]+=f[u];
                else {
                    dis[v]=eg[i].dis+dis[u];f[v]=f[u];
                }
                if(!vist[v]){vist[v]=1;q.push(v);}}
                
            }
            f[u]=0;
        }
    }
    
    int main() 
    { cin>>n>>m; 
    while(m--) { cin>>a>>b>>c; if(!dk[a][b])dk[a][b]=c;else dk[a][b]=min(dk[a][b],c);  }
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(dk[i][j])adde(i,j,dk[i][j]);
    spfa();
    if(dis[n]==0x3f3f3f3f)cout<<"No answer";
    else
    cout<<dis[n]<<" "<<f[n];
     }
  • 相关阅读:
    初涉网络安全领域
    pythontip上的数据结构和算法练习题
    学c++需要先学c语言吗?
    田园将芜胡不归
    java学习视频
    微软越来越喜欢Github(转载)
    指针(一级指针、二级指针)
    数字盒子
    点结构Tpoint
    枚举类型
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/11305624.html
Copyright © 2011-2022 走看看