http://acm.hdu.edu.cn/showproblem.php?pid=1874
HDU 1874
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
int Min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int w[201][201],v[201],d[201];
int n,m;
while(cin>>n>>m)
{
memset(w,INF,sizeof(w));
memset(d,0,sizeof(d));
int x,y,z;
for(int i=0;i<m;i++)
{
cin>>x>>y>>z;
if(z<w[x][y])
w[x][y]=w[y][x] =z; //由x到y和y到x的路径都改写
}
int star,End;
cin>>star>>End;
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)
d[i]=(i==star? 0 : w[star][i]); //起点到起点的距离为0,到其他的点的距离分为:1.有直接通路为直接通路长2.无直接通路为无限长
v[star]=1; //标记起点,防止重复走
for(int i=0;i<n;i++) //每次循环找到一个点(优先选择到达当前点短的路径),然后找到起点到这个点的最端路径
{
int m=INF;
for(int j=0;j<n;j++) //优先当前点的通路中最短的一条
if(!v[j]&&d[j]<=m)
m=d[x=j];
v[x]=1; //标记
for( int j=0;j<n;j++) //被标记点的能直接到达的通过被标记点和不通过被标记点的路径选择(优先选择短的)
if(!v[j])
d[j]=Min(d[j],d[x]+w[x][j]);
}
//for(int i=0;i<n;i++)
// cout <<d[i]<<endl;
if(d[End]!=INF)
cout<<d[End]<<endl;
else
cout<<-1<<endl;
}
}
“`