最短路计数,含重边。
————————————————
真事坑人,而且窝也好久没有做图论题了,尴尬
注意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]; }