hdu 1548 最短路

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

就是Dijkstra算法的应用。。。。不过被坑了好久,原来电梯的up、down是并列的,初始化的时候出错了。。。。调了好半天。。突然醒悟过来了,,,orz

View Code
 1 #include<iostream>
 2 #include<cstring>
 3 const int N=220;
 4 const int inf=1000000;
 5 using namespace std;
 6 
 7 int edge[N][N];
 8 int dist[N];
 9 int visited[N];
10 int n,A,B;
11 
12 /*
13 void floyd(){
14     for(int k=1;k<=n;k++){
15         for(int i=1;i<=n;i++){
16             for(int j=1;j<=n;j++){
17                 if(edge[i][k]+edge[k][j]<edge[i][j]){
18                     edge[i][j]=edge[i][k]+edge[k][j];
19                     path[i][j]=path[i][k];
20                 }
21             }
22         }
23     }
24     if(edge[A][B]==inf){
25         printf("-1\n");
26     }else {
27         int count=1;
28         int k=A;
29         while(path[k][B]!=B){
30             k=path[k][B];
31             count++;
32         }
33         printf("%d\n",count);
34     }
35 }*/
36 
37 void Dijkstra(int v0){
38     memset(visited,0,sizeof(visited));
39     for(int i=1;i<=n;i++){
40         dist[i]=edge[v0][i];
41     }
42     dist[v0]=0;
43     visited[v0]=1;
44     for(int i=1;i<n;i++){
45         int min=inf,u=v0;
46         for(int j=1;j<=n;j++){
47             if(!visited[j]&&dist[j]<min){
48                 u=j,min=dist[j];
49             }
50         }
51         if(min==inf)return ;
52         visited[u]=1;
53         for(int k=1;k<=n;k++){
54             if(!visited[k]&&edge[u][k]<inf&&edge[u][k]+dist[u]<dist[k]){
55                 dist[k]=dist[u]+edge[u][k];
56             }
57         }
58     }
59 }
60 
61 int main(){
62     while(scanf("%d",&n)!=EOF){
63         if(n==0)break;
64         for(int i=1;i<=n;i++){
65             for(int j=1;j<=n;j++){
66             //    path[i][j]=j;//此时为顺序输出
67                 if(i==j){
68                     edge[i][j]=0;
69                 }else 
70                     edge[i][j]=inf;
71             }
72         }
73         int num;
74         scanf("%d%d",&A,&B);
75         for(int i=1;i<=n;i++){
76             scanf("%d",&num);
77             if(i+num<=n)edge[i][i+num]=1;//两个状态时并列的,orz。。。
78             if(i-num>=1)edge[i][i-num]=1;//
79         }
80         //floyd();
81         Dijkstra(A);
82         if(dist[B]<inf){
83             printf("%d\n",dist[B]);
84         }else 
85             printf("-1\n");
86     }
87     return 0;
88 }

 

posted @ 2013-01-30 11:28  ihge2k  阅读(354)  评论(0编辑  收藏  举报