1. 程式人生 > >poj 2387 最短路 spfa 實現

poj 2387 最短路 spfa 實現

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