POJ 1122 FDNY to the Rescue! Floyd 打印路径就行了

  题目大意:

纽约消防部门的支援速度是值得纽约人骄傲的一件事。但是他们想要最快的支援速度,帮助他们提升支援速度他们要调度离着火点最近的一个消防站。他们要你写一个程序来维护纽约消防站的光荣传统。软件需要有的功能是,能获取着火点的地址 和 消防站的位置, 街道交叉路口, 从一个交叉路口到达另一个交叉路口的时间。 他将要计算从消防站到达着火点需要多少时间。

给你一个具体的着火点的地址,这个软件应该找出所有消防站到达着火点的距离, 并且从小到大进行排序。以便消防员来调度人员到达救火地点。

 

#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 Point

{

    int e, w;

} dist[maxn];



bool cmp(Point A,Point B)

{

    return A.w < B.w;

}

int Path[maxn][maxn], G[maxn][maxn], n;



void Floyd()

{

    for(int k=1; k<=n; k++)

    {

        for(int i=1; i<=n; i++)

        {

            for(int j=1; j<=n; j++)

            {

                if(G[i][j] > G[i][k] + G[k][j] )

                {

                    G[i][j] = G[i][k] + G[k][j];

                    Path[i][j] = Path[i][k];

                }

            }

        }

    }

}



void PutPath(int Star,int End)

{

    while(Star != End)

    {

        printf("\t%d", Star);

        Star = Path[Star][End];

    }

    printf("\t%d\n", Star);

}



int main()

{

    int a;



    cin >> n;



    for(int i=1; i<=n; i++)

    {

        for(int j=1; j<=n; j++)

        {

            Path[i][j] = j;

            cin >> G[i][j];



            if(G[i][j] == -1)

                G[i][j] = INF;

        }

    }

    int End, k = 0;



    Floyd();



    cin >> End;



    while(scanf("%d",&a) != EOF)

    {

        dist[k].w = G[a][End];

        dist[k++].e = a;

    }



    sort(dist, dist + k, cmp);



    cout << "Org\tDest\tTime\tPath" << endl;



    for(int i=0; i<k; i++)

    {

        printf("%d\t%d\t%d", dist[i].e, End, G[dist[i].e][End]);



        PutPath(dist[i].e, End);

    }

    return 0;

}

 

你可能感兴趣的:(floyd)