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; }