2544本身是道最短路水题,用dijskstra是可以1Y的,但是我却WA了又WA,又WA了又WA,WA了又WA,WA了又WA,WA了又WA。。。。。为什么呢,经过几个小时的调试我终于发现了问题:
题中说明 输入权值最多为1000,于是我的 INF 就定义了 1001,本想节省空间,但谁知这个善意之举却成了让我蛋疼几个小时的罪魁祸首!! 因为输入的两点之间的距离确实为 小于1000,但起点和终点之间的距离很合能超过1000!!!,如果这样我的INF就失去了作用
(附源代码)
#include <stdio.h> #include <string.h> #define INF 0xfffffff /*如果INF定位为 1001 就会WA !!!!*/ #define MAXN 200 int dijkstra(int s,int e); int G[MAXN][MAXN]; int n,m; int main() { int a,b,c; int i,j; int mindis; while(scanf("%d%d",&n,&m) && (m || n)) { for(i = 0; i <= n ;i++) for(j = 0 ; j <= n; j++) G[i][j] = INF; while(m--) { scanf("%d%d%d",&a,&b,&c); G[b][a] = G[a][b] = c; } mindis = dijkstra(1,n); printf("%d/n",mindis); } return 0; } int dijkstra(int s,int e) { int i,j; int vis[MAXN],dis[MAXN]; int min,w; memset(vis,0,sizeof(vis)); for(i = 1; i <= n; i++) dis[i] = G[s][i]; vis[1] = 1; dis[1] = 0; for(i = 1; i <= n; i++) { min = INF; for(j = 1; j <= n; j++) { if(!vis[j] && dis[j] < min) { min = dis[j]; w = j; } } vis[w] = 1; if(w == e) return dis[e]; for(j = 1; j <= n; j++) { if(!vis[j] && dis[j] > dis[w] + G[w][j]) dis[j] = dis[w] + G[w][j]; } } return dis[e]; }