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


你可能感兴趣的:(poj 2387 最短路 spfa 实现)