码迷,mamicode.com
首页 > 其他好文 > 详细

SPFA 最短路径打印方法

时间:2014-12-19 11:35:52      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   io   color   os   sp   for   on   

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
#define INF 0xfffffff
#define maxn 40

struct Edge
{
    int e, w;
    Edge(int e=0,int w=0) : e(e), w(w) {}
};
int Path[maxn], n, dist[maxn];
bool vis[maxn];
vector<Edge> G[maxn];

void Spfa(int Star,int End)
{
    Edge P, Pn;
    dist[Star] = 0;
    queue<Edge> Q;
    Q.push(Edge(Star,0));

    while( !Q.empty() )
    {
        P = Q.front();
        Q.pop();
        vis[P.e] = true;

        int len = G[P.e].size();

        for(int i=0; i<len; i++)
        {
            Pn = G[P.e][i];

            if(dist[Pn.e] > dist[P.e] + Pn.w)
            {
                dist[Pn.e] = dist[P.e] + Pn.w;
                Path[Pn.e] = P.e;
                if( !vis[Pn.e] )
                {
                    Q.push(Pn);
                    vis[Pn.e] = true;
                }
            }
        }
    }
}

void PutPath(int Star,int End)
{
    if(Star == End)
    {
        printf("%d", Star);
        return ;
    }

    PutPath(Star, Path[End]);

    printf("---->%d", End);
}
void Init()
{
    for(int i=1; i<=n; i++)
    {
        G[i].clear();
        dist[i] = INF;
        vis[i] = false;
        Path[i] = i;
    }
}

int main()
{
    int m;
    cin >> n >> m;

    Init();

    for(int i=1; i<=m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        G[a].push_back(Edge(b,c));
    }

    Spfa(1, n);

    printf("%d\n", dist[n]);

    PutPath(1,n);



    return 0;
}
/*
4 3
1 2 1
2 3 1
3 4 1
*/

 

SPFA 最短路径打印方法

标签:style   blog   ar   io   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/chenchengxun/p/4173441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!