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 }