hdu 1142 A Walk Through the Forest

http://acm.hdu.edu.cn/showproblem.php?pid=1142  Dijkstra求最短路径,记录最短路径的条数,cnt记录最短路径的条数出错,不知道错在哪里?

View Code
  1 #include<iostream>
2 #include<cstring>
3 #include<climits>
4 #include<cmath>
5 using namespace std;
6 #define M 2000000
7 int mat[1008][1008];
8 bool visited[1008];
9 int dis[1008];
10 int cnt[1008];//记录到达i点的最短路径的数目
11 int n,m;
12 int S=1,T=2;//起点,终点
13 void init()
14 {
15 for(int i=0;i<=n;i++)
16 for(int j=0;j<=n;j++) mat[i][j]=M;//
17 }
18 int find()//每次从dis[]中找个最小的
19 {
20 int minx=M,pos=-1;
21 for(int i=1;i<=n;i++)
22 {
23 if(!visited[i] && dis[i]<minx) minx=dis[i],pos=i;
24 }
25 return pos;
26 }
27 void dijkstra()//从S到T扩展
28 {
29 memset(visited,false,sizeof(visited));
30 fill_n(cnt,n+1,0);
31 int i,j,v;
32 for(i=1;i<=n;i++)
33 {
34 dis[i]=mat[S][i];
35 }
36 visited[S]=true;
37 dis[S]=0;
38 cnt[S]=1;
39 for(i=1;i<n;i++)
40 {
41 v=find();
42 visited[v]=true;
43 if(cnt[v]==0) cnt[v]++;
44 for(j=1;j<=n;j++)
45 {
46 if(!visited[j] && mat[v][j]+dis[v]<dis[j])
47 {
48 dis[j]=mat[v][j]+dis[v];
49 cnt[j]=cnt[v];//路径数目记录
50 }
51 else if(!visited[j] && mat[v][j]+dis[v]==dis[j])
52 {
53 cnt[j]+=cnt[v];//路径数据记录
54 }
55 }
56 }
57 //for(i=1;i<=n;i++) cout<<"cnt["<<i<<"]:"<<cnt[i]<<endl;
58 //for(i=1;i<=n;i++) cout<<"dis["<<i<<"]:"<<dis[i]<<endl;
59 }
60 int main()
61 {
62 int x,y,d;
63 while(cin>>n&&n&&cin>>m)
64 {
65 init();
66 while(m--)
67 {
68 cin>>x>>y>>d;
69 mat[x][y]=d;
70 mat[y][x]=d;
71 }
72 dijkstra();
73 if(dis[T]==M) cout<<"0"<<endl;
74 else cout<<cnt[T]<<endl,cout<<dis[T]<<endl;
75 }
76 return 0;
77 }
78 /*
79 5 7
80 1 3 2
81 1 4 2
82 1 2 10
83 1 5 12
84 2 5 24
85 2 4 24
86 3 4 3
87
88 7 10
89 1 3 8
90 1 4 10
91 1 5 20
92 3 6 20
93 4 6 2
94 4 5 1
95 5 6 1
96 6 7 1
97 7 2 1
98 2 5 20
99
100 */


 

posted @ 2012-03-29 20:30  keepmoving89  阅读(161)  评论(0编辑  收藏  举报