poj 2387 最短路 spfa 實現
阿新 • • 發佈:2018-12-30
http://poj.org/problem?id=2387
題目大意就是求最短路,從n到1的最短路。就用來熟悉一下spfa的寫法。
一開始貢獻了好幾次wa,結果發現是因為n,m寫反了。。。。
沒有什麼拐彎的地方,來熟悉spfa直接附上程式碼:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> using namespace std; #define M 2009 #define INF 0x3f3f3f3f struct edge { int to,w; }; bool inq[M]; vector <edge> g[M]; int dis[M]; int n,m; void spfa(int s) { for(int i = 1;i <= n;i++) { dis[i] = INF; inq[i] = false; } dis[s] = 0; queue<int> q; q.push(s); inq[s] = true; while(!q.empty()) { s = q.front(); inq[s] = false; q.pop(); for(int i = 0;i < g[s].size();i++) { int v = g[s][i].to; int w = g[s][i].w; if(dis[v] > dis[s]+w) { dis[v] = dis[s]+w; if(!inq[v]) { inq[v] = true; q.push(v); } } } } } int main() { while(scanf("%d %d",&m,&n)==2) //m n寫反了···· 貢獻好幾次WA { for(int i = 1;i <= n;i++) g[i].clear(); for(int i = 0;i < m;i++) { int a,b,c; scanf("%d %d %d",&a,&b,&c); edge e; e.to = b;e.w = c; g[a].push_back(e); e.to = a; g[b].push_back(e); //無向圖 變化成雙向的。 } spfa(n); printf("%d\n",dis[1]); } return 0; }