Dijkstra 單源最短路(三)
阿新 • • 發佈:2018-11-19
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #include<queue> #include<iomanip> #define MAXV 100 using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1000010; struct qNode { int v; int c; qNode(int _v = 0, int _c = 0) : v(_v), c(_c) {} bool operator < (const qNode &r)const { return c > r.c; } }; struct Edge { int v; int cost; Edge(int _v = 0, int _cost = 0) : v(_v), cost(_cost) {} }; vector<Edge> E[MAXN]; bool vis[MAXN]; int dist[MAXN]; // 最短路路距離 void Dijkstra(int n, int start) // 點的編號從1開始 { memset(vis, false, sizeof(vis)); memset(dist, 0x3f, sizeof(dist)); priority_queue<qNode> que; while (!que.empty()) { que.pop(); } dist[start] = 0; que.push(qNode(start, 0)); qNode tmp; while (!que.empty()) { tmp = que.top(); que.pop(); int u = tmp.v; if (vis[u]) { continue; } vis[u] = true; for (int i = 0; i < E[u].size(); i++) { int v = E[tmp.v][i].v; int cost = E[u][i].cost; if (!vis[v] && dist[v] > dist[u] + cost) { dist[v] = dist[u] +cost; que.push(qNode(v, dist[v])); } } } } void addEdge(int u, int v, int w) { E[u].push_back(Edge(v, w)); } int main() { int start; int m,n; int end; cin>>n>>m; while(m--){ int u,v,w; cin>>u>>v>>w; addEdge(u, v, w); addEdge(u, w, v); } cin>>start; cin>>end; Dijkstra(n, start); for(int i=1;i<=n;i++) cout<<"到達第"<<i<<"個點的距離為"<<setw(5)<<dist[i]<<endl; }