我又在这种裸题上花了一上午的宝贵时间,唉,这回错在忽略了重边的情况、
#include"stdio.h" #include"string.h" #define Maxn 0x7fffffff int map[1005][1005]; int dis[1005]; void fresh(int n) { int i,j; for(i=0;i<=n;i++) { for(j=0;j<=n;j++) map[i][j]=Maxn; map[i][i]=0; } for(i=0;i<=n;i++) dis[i]=Maxn; } void Dijkstra(int n) { int now=n,i,j,min,vis[1005]; dis[now]=0; memset(vis,0,sizeof(vis)); vis[now]=1; for(i=0;i<n;i++) { for(j=1;j<=n;j++) { if(map[now][j]!=Maxn&&dis[now]+map[now][j]<dis[j]) dis[j]=dis[now]+map[now][j]; } min=Maxn; for(j=1;j<=n;j++) if(min>dis[j]&&!vis[j]) min=dis[now=j]; vis[now]=1; } } int main( ) { int t,n,x,y; int i,j,leth; scanf("%d%d",&t,&n); fresh(n); for(i=1;i<=t;i++) { scanf("%d%d%d",&x,&y,&leth); if(leth<map[x][y]) map[x][y]=map[y][x]=leth; } Dijkstra(n); printf("%d\n",dis[1]); return 0; }