poj 3463 最短路径+次最短路径+邻接表

算法:Dijstra算法

题目大意:求出最短路径和次最短路径,如果最短路径+1==次最短路径,则输出最短路径条数+次最短路径条数,否则输出最短路径条数。

用邻接表做,不用邻接矩阵,因为有重边。我开是用邻接矩阵做的,算法没问题,卡了半天,计算条数的时候会少。

View Code
 1 #include <stdio.h>
2 #include <string.h>
3
4 const int INF = 1 << 30;
5 int dis[1005][2],v[1005][2],dp[1005][2],box[1005];
6 struct node
7 {
8 int u,val,next;
9 }Edge[10005];
10 int n,m,S,T;
11 int Dijstra(int S,int T)
12 {
13 int i,j;
14 memset(v,0,sizeof(v));
15 memset(dp,0,sizeof(dp));
16 for(i = 1;i <= n;i ++)
17 dis[i][0] = dis[i][1] = INF;
18 dis[S][0] = 0;
19 dp[S][0] = 1;
20 int x,flag;
21 for(i = 1;i <= n*2;i ++)
22 {
23 int min_d = INF;
24 for(j = 1;j <= n;j ++)
25 {
26 if(!v[j][0] && min_d > dis[j][0])
27 {
28 min_d = dis[j][0];
29 x = j;
30 flag = 0;
31 }
32 else if(!v[j][1] && min_d > dis[j][1])
33 {
34 min_d = dis[j][1];
35 x = j;
36 flag = 1;
37 }
38 }
39 v[x][flag] = 1;
40 if(min_d == INF) break;
41 for(j = box[x];j != -1;j = Edge[j].next)
42 {
43 int len = min_d + Edge[j].val,y = Edge[j].u;
44 if(len < dis[y][0])
45 {
46 dis[y][1] = dis[y][0];
47 dp[y][1] = dp[y][0];
48 dis[y][0] = len;
49 dp[y][0] = dp[x][flag];
50 }
51 else if(len == dis[y][0])
52 {
53 dp[y][0] += dp[x][flag];
54 }
55 else if(len < dis[y][1])
56 {
57 dis[y][1] = len;
58 dp[y][1] = dp[x][flag];
59 }
60 else if(len == dis[y][1])
61 {
62 dp[y][1] += dp[x][flag];
63 }
64 }
65 }
66 int ans;
67 if(dis[T][0] + 1 == dis[T][1])
68 ans = dp[T][0] + dp[T][1];
69 else
70 ans = dp[T][0];
71 return ans;
72 }
73 int main()
74 {
75 int i,j;
76 int ca;
77 scanf("%d",&ca);
78 while(ca --)
79 {
80 scanf("%d %d",&n,&m);
81 memset(box,-1,sizeof(box));
82 for(i = 1;i <= m;i ++)
83 {
84 int a,b,c;
85 scanf("%d %d %d",&a,&b,&c);
86 Edge[i].u = b;
87 Edge[i].val = c;
88 Edge[i].next = box[a];
89 box[a] = i;
90 }
91 scanf("%d %d",&S,&T);
92 printf("%d\n",Dijstra(S,T));
93 }
94 return 0;
95 }

posted @ 2011-09-24 10:52  zhangteng  阅读(404)  评论(0编辑  收藏  举报