hdu(2112)最短路径问题
两个小小的细节,调试了半天啊,不过这次学了下在codeblocks里面的调试,原来我只会在vc里面调试
阻断路径问题,Dijkstra算法,从起始点到终点,只要两个步骤,第一求距离起始点最短的点,把该点加入起点集后更新起点到其余个点的距离,知道把所有点都添加进来,所以外循环的次数就是点数
1 #include <stdio.h> 2 #include <cstring> 3 #include <stdlib.h> 4 #define MAX 0x7f7f7f7f 5 int map[155][155],visited[155],dis[155]; 6 char path[155][35],start[35],end[35]; 7 8 9 int count=0; 10 void init() 11 { 12 memset(path,0,sizeof(path)); 13 memset(visited,0,sizeof(visited)); 14 memset(dis,MAX,sizeof(dis)); 15 memset(map,MAX,sizeof(map)); 16 count=0; 17 } 18 19 int findindex(char a[])// 20 { 21 int i; 22 for(i=0;i<count;i++) 23 { 24 if(strcmp(path[i],a)==0) 25 return i; 26 } 27 strcpy(path[count],a); 28 return count++; 29 } 30 31 32 void Dijkstra() 33 { 34 int i,j; 35 dis[0]=0; 36 int pos=0,min; 37 for(i=0;i<count;i++) 38 { 39 min=MAX; 40 for(j=0;j<count;j++) 41 { 42 if(dis[j]<min && visited[j]==0) 43 { 44 min=dis[j]; 45 pos=j; 46 } 47 } 48 visited[pos]=1; 49 if(pos==1) return ; 50 51 for(j=0;j<count;j++) 52 { 53 if(map[pos][j]!=MAX && visited[j]==0)//j必须是另外一个集合的点 54 if(dis[j]>map[pos][j]+dis[pos]) 55 { 56 dis[j]=map[pos][j]+dis[pos]; 57 } 58 } 59 } 60 } 61 62 63 64 int n,min; 65 66 int main() 67 { 68 char a[35],b[35]; 69 int i,x,y,value; 70 71 while(1) 72 { 73 init();//初始化 74 scanf("%d",&n); 75 if(n==-1) break; 76 scanf("%s%s",start,end); 77 findindex(start); 78 findindex(end); 79 for(i=0;i<n;i++) 80 { 81 scanf("%s %s %d",a,b,&value); 82 x=findindex(a); 83 y=findindex(b); 84 if(value<map[x][y]) 85 { 86 map[x][y]=map[y][x]=value; 87 } 88 }//输入完成 89 90 91 Dijkstra(); 92 if(dis[findindex(end)]!=MAX) 93 printf("%d\n",dis[findindex(end)]); 94 else printf("-1\n"); 95 } 96 return 0; 97 }
唉……