题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
#include <iostream>
#include <string.h>
#define N 205
#define MAX 100000005
using namespace std;
/****************************************************************************************************************
题意:dijkstra
思路:
1,注意不在起终点之间没有路径到大的判断条件
2,在注释中已给出,用dist 不能用 map[i][j]
****************************************************************************************************************/
int map[N][N];
int dist[N];
int visit[N]; //访问标志,用来判断点是否在特殊路径的集合内
int dijkstra(int st,int n)
{
memset(dist,MAX,sizeof(dist));
memset(visit,0,sizeof(visit));
for(int i = 0;i < n;i ++) //初始化特殊路径长度
dist[i]=map[st][i];
dist[st]=0; //自己到自己长度为0
visit[st]=1;
for(int i = 1;i <= n;i ++){
int id,ans=MAX;
for(int j = 0;j < n;j ++){
if(!visit[j] && dist[j] < ans){ //非特殊路径最小值
ans=dist[j];
id=j;
}
}
visit[id]=1;
for(int j = 0;j < n;j ++)
if(!visit[j] && dist[id]+map[id][j] < dist[j])
dist[j]=dist[id]+map[id][j]; //最优存在于 非特殊路径最小点到当前点 or st直接到 j 的距离
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
for(int i = 0;i < n;i ++)
for(int j = 0;j < n;j ++)
map[i][j]=MAX;
int a,b,le;
for(int i = 0;i < m;i ++){
cin>>a>>b>>le;
if(le < map[a][b])
map[a][b]=map[b][a]=le; //无向图,双向赋最小值
}
int st,ed;
cin>>st>>ed;
dijkstra(st,n);
if(dist[ed] != MAX) //这里wa了,不知道为什么用 map[st][ed] != MAX 不能表示 st-ed没有路径
cout<<dist[ed]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}