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 }

唉……

posted on 2012-08-14 09:59  矮人狙击手!  阅读(320)  评论(0编辑  收藏  举报

导航