在此郑重的向南柯小朋友表示我的感谢!!
如果不是他告诉我输入的时候需要处理
if(g[a][b] == -1 || g[a][b] > w)
g[a][b] = g[b][a] = w;
(从一个点到另外一个点竟然有好几种选择,囧,我们仅仅需要考虑最小的就ok了)这个东西的话,相信我是找不出问题来的.......
也向他表示感谢HDU today这一题也是他找出了问题,就是起点和目的地相同的情况我没有考虑......
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 4 int g[200][200]; 5 int vis[200]; 6 int d[200]; 7 int n,m; 8 int start,end; 9 10 void dij() 11 { 12 memset(vis,0,sizeof(vis)); 13 for(int i = 0;i < n;i ++) 14 { 15 d[i] = g[start][i]; 16 } 17 18 vis[start] = 1; 19 for(int i = 0;i < n;i ++) 20 { 21 int minn = -1; 22 int k = 0; 23 for(int j = 0;j < n;j ++) 24 { 25 if(!vis[j]&&d[j] != -1&&(minn == -1 || minn > d[j])) 26 minn = d[k = j]; 27 } 28 29 if(minn == -1) 30 break; 31 vis[k] = 1; 32 33 for(int j = 0;j < n;j ++) 34 { 35 if(!vis[j] &&g[k][j] != -1 && (d[j] == -1 || d[j] > d[k] + g[k][j])) 36 { 37 d[j] = d[k] + g[k][j]; 38 } 39 } 40 } 41 42 printf("%d\n",d[end]); 43 } 44 45 int main() 46 { 47 while(scanf("%d%d",&n,&m) == 2) 48 { 49 memset(g,-1,sizeof(g)); 50 for(int i = 0;i < m;i ++) 51 { 52 int a,b,w; 53 scanf("%d%d%d",&a,&b,&w); 54 if(g[a][b] == -1 || g[a][b] > w) 55 g[a][b] = g[b][a] = w; 56 g[a][a] = g[b][b] = 0; 57 } 58 59 scanf("%d%d",&start,&end); 60 if(start == end) 61 { 62 printf("0\n"); 63 continue; 64 } 65 dij(); 66 } 67 68 return 0; 69 }
我是喜欢用-1来表示不可达的,不太喜欢用一个大值,有时候出问题了就喜欢看是不是这个-1的问题,汗......转移了我找错的注意力......不过我还是用-1代替最大值,(*^__^*) 嘻嘻……