http://acm.hdu.edu.cn/showproblem.php?pid=3191
dijkstra求次短路
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=60; 6 int g[N][N],n,m; 7 int dis[N][2],cnt[N][2]; 8 bool vis[N][2]; 9 void dijkstra(int p) 10 { 11 memset(vis,0,sizeof(vis)); 12 memset(cnt,0,sizeof(cnt)); 13 memset(dis,-1,sizeof(dis)); 14 dis[p][0]=0; cnt[p][0]=1; 15 for(int k=0;k<2*n;k++) 16 { 17 int x,y,min=-1; 18 for(int i=0;i<n;i++) 19 if(!vis[i][0] && dis[i][0]!=-1 && (min==-1 || dis[i][0]<min)) 20 min=dis[x=i][y=0]; 21 else if(!vis[i][1] && dis[i][1]!=-1 && (min==-1 || dis[i][1]<min)) 22 min=dis[x=i][y=1]; 23 if(min==-1) break; 24 vis[x][y]=true; 25 for(int v=0;v<n;v++) if(g[x][v]!=-1) 26 { 27 int tdis=min+g[x][v]; 28 if(dis[v][0]==-1 || tdis<dis[v][0]) 29 { 30 dis[v][1]=dis[v][0]; 31 cnt[v][1]=cnt[v][0]; 32 dis[v][0]=tdis; 33 cnt[v][0]=cnt[x][y]; 34 } 35 else if(tdis==dis[v][0]) cnt[v][0]+=cnt[x][y]; 36 else if(dis[v][1]==-1 || tdis<dis[v][1]) 37 { 38 dis[v][1]=tdis; 39 cnt[v][1]=cnt[x][y]; 40 } 41 else if(tdis==dis[v][1]) cnt[v][1]+=cnt[x][y]; 42 } 43 } 44 } 45 int main() 46 { 47 int s,e; 48 while(~scanf("%d%d%d%d",&n,&m,&s,&e)) 49 { 50 memset(g,-1,sizeof(g)); 51 for(int i=0;i<m;i++) 52 { 53 int u,v,w; 54 scanf("%d%d%d",&u,&v,&w); 55 if(g[u][v]==-1 || w<g[u][v]) g[u][v]=w; 56 } 57 dijkstra(s); 58 printf("%d %d\n",dis[e][1],cnt[e][1]); 59 } 60 }