求单源最短路径,简单的用Dijkstra算法水过。
不过隐藏着一个小陷阱,就是可能两个点之间有多条路,这时候取最小即可。
#include <iostream>
using namespace std;
#define MAXN 220
#define INF 0x3ffffff
int map[MAXN][MAXN];
int dis[MAXN];
bool visited[MAXN];
void init(int n) {
for (int i=0; i<n; i++) {
dis[i] = INF;
visited[i] = false;
for (int j=0; j<n; j++) {
map[i][j] = INF;
}
}
}
int Dijkstra(int n, int begin, int end) {
visited[begin] = true;
dis[begin] = 0;
int index = begin;
for (int j=0; j<n; j++) {
int minDis = INF;
int minIndex;
for (int i=0; i<n; i++) {
if (!visited[i] && dis[i] > dis[index] + map[i][index]) {
dis[i] = dis[index] + map[i][index];
}
}
for (int i=0; i<n; i++) {
if (!visited[i] && dis[i] < minDis) {
minDis = dis[i];
index = i;
}
}
visited[index] = true;
}
return dis[end] == INF ? -1 : dis[end];
}
int main() {
int n, m;
while (cin>>n>>m){
init(n);
for (int i=0; i<m; i++){
int a, b, c;
cin>>a>>b>>c;
//注意可能有重边,取最小即可;
if (map[a][b] == INF) {
map[a][b] = c;
map[b][a] = c;
} else {
if (map[a][b] > c) {
map[a][b] = c;
map[b][a] = c;
}
}
}
int begin, end;
cin>>begin>>end;
cout<<Dijkstra(n, begin, end)<<endl;
}
}