链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1874
最短路问题,Dijkstra
注意当起始点和结束点相同时要输出0,被坑了一次
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
int map[201][201];
bool used[201];
void Dijk(int s,int e,int n)
{
memset(used,0,sizeof(used));
int T=n;
used[s]=1;
while(T--)
{
int k,mini=INF;
for(int i=0;i<n;i++)
if(!used[i] && map[s][i]<mini)
mini=map[s][k=i];
used[k]=1;
for(int i=0;i<n;i++)
if(!used[i] && map[s][i]>map[s][k]+map[k][i])
map[s][i]=map[s][k]+map[k][i];
}
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
int s,e,dis;
memset(map,INF,sizeof(map));
while(m--)
{
scanf("%d %d %d",&s,&e,&dis);
if(map[s][e]>dis) map[s][e]=map[e][s]=dis;
}
scanf("%d %d",&s,&e);
if(s==e) {printf("0\n");continue;} //起始点与结束点相同
Dijk(s,e,n);
printf(map[s][e]==INF ? "-1\n" : "%d\n",map[s][e]);
}
return 0;
}