《挑戰程序設計競賽》,初級篇–圖
// Dijkstra 路徑還原
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxv 101
#define maxe 101
#define INF 9999
int V;
int d[maxv];
bool used[maxv];
int prev[maxv];
int cost[maxv][maxv];
void init()
{
for(int i = 0; i < V; i++)
for(int j = 0; j < V; j++)
cost[i][j] = INF;
}
// 從起點s出發
void dijkstra(int s)
{
fill(d, d+V, INF);
fill(used, used+V, false);
fill(prev, prev+V, -1);
d[s] = 0;
while(true)
{
int v = -1;
for(int u = 0; u < V; u++)
if(!used[u] && (v == -1 || d[u] < d[v]))
v = u;
if(v == -1) break;
used[v] = true;
for(int u = 0; u < V; u++)
{
if(d[u] > d[v] + cost[v][u])
{
d[u] = d[v] + cost[v][u];
prev[u] = v;
}
}
}
}
// 到t點的最短路徑
vector<int> get_path(int t)
{
vector<int> path;
for(; t != -1; t= prev[t])
path.push_back(t);
reverse(path.begin(),path.end());
return path;
}
int main()
{
int E;
cin>>V>>E;
init();
int a, b, c;
for(int i = 0; i < E; i++)
{
cin>>a>>b>>c;
cost[a][b] = c;
}
dijkstra(1);
vector<int> vec = get_path(4);
vector<int>::iterator it;
cout<<"最短路徑爲:";
for(it = vec.begin(); it != vec.end(); it++)
{
if(it != vec.end()-1)
cout<<*it<<"->";
else
cout<<*it;
}
return 0;
}
/*
測試數據:
5 6
0 1 1
0 2 3
1 2 4
1 4 6
2 3 2
2 4 1
*/