http://acm.hdu.edu.cn/showproblem.php?pid=1874
很水
#include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> #include<queue> #include<map> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int N=205; const int MAX=0x5fffffff; int side[N][N];//边最大代表 没有连接 否则代表两点之间距离 int dist[N];//到出发点的距离 bool in[N];//是否已经最终更新 true 为已经最终更新 false 代表尚未最终更新 int main() { //freopen("data.txt","r",stdin); int n,m; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=0;i<n;++i) for(int j=0;j<n;++j) side[i][j]=MAX;//初始化 while(m--) { int i,j,d; cin>>i>>j>>d; if(d<side[i][j])//为了防止有重边 { side[i][j]=side[j][i]=d; } } int S,T; cin>>S>>T; if(S==T)//特殊情况 { cout<<"0"<<endl; continue; } for(int i=0;i<n;++i) dist[i]=side[S][i];//初始化各点到 出发点的距离 memset(in,false,sizeof(in)); in[S]=true;//标记 出发点已经更新 for(int w=1;w<n;++w)//最多 n-1 次查询 { int M=MAX,k=-1; for(int i=0;i<n;++i) { if(in[i]==false&&dist[i]<M)//每次找还未被最终更新的点中 到出发点最短的点 { M=dist[i]; k=i; } } if(k==-1)//如果没找到 跳出循环 break; if(k==T)//如果这个点就是终点 无需在继续寻找 break; in[k]=true; for(int i=0;i<n;++i) { if(in[i]==false) { if(dist[i]>dist[k]+side[k][i])//用目前最短的点去更新其它剩余的点 { dist[i]=dist[k]+side[k][i]; } } } } if(dist[T]==MAX) cout<<"-1"<<endl; else cout<<dist[T]<<endl; } return 0; }