Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

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 }

 

posted on 2012-05-17 17:47  Qiuqiqiu  阅读(241)  评论(0编辑  收藏  举报