题目链接: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; }