有一点需要注意的东西,就是他们的测试数据。他们并没有说保证每条边只输入一次,所以在输入过程中会有重复的边,这是应当取权值较小的边,最开始没有注意,所以就有了十几次WA。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxdis 999999
int town[305][305];
int dis[305];//目前得到的最小距离
int final[305];
void dijkstra(int s,int t,int N){
dis[s]=0;
for(int times=1;times<=N;++times){
int mint=maxdis;
int v;
for(int i=0;i<N;++i){
if(!final[i]){
if(dis[i]<mint){
mint=dis[i];
v=i;
}
}
}
final[v]=true;
for(int i=0;i<N;++i){
if(town[v][i]<maxdis){
if((dis[v]+town[v][i])<dis[i])dis[i]=dis[v]+town[v][i];
}
}
}//进行N次循环
}
int main(){
int N,M;
while(scanf("%d",&N)!=EOF){
for(int i=0;i<N;++i){
final[i]=false;
}
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
town[i][j]=maxdis;
town[j][i]=maxdis;
}
}
for(int i=0;i<N;++i){
dis[i]=maxdis;
}
scanf("%d",&M);//M条路
for(int i=1;i<=M;++i){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x==y){i--;continue;}
if(z<town[x][y])
{town[x][y]=z;
town[y][x]=z;}
}
int s,t;
scanf("%d%d",&s,&t);
dijkstra(s,t,N);
if(dis[t]>10000){cout<<-1<<endl;continue;}
cout<<dis[t]<<endl;
}
return 0;
}