欢迎来到SFWR的博客

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];
 }

 

posted @ 2019-08-05 21:23  SFWR  Views(176)  Comments(0Edit  收藏  举报