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;
}
时间: 2024-12-05 05:52:05

POJ 1122 FDNY to the Rescue! Floyd 打印路径就行了的相关文章

poj 1122 FDNY to the Rescue! (dijkstra)

FDNY to the Rescue! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2475   Accepted: 755 Description The Fire Department of New York (FDNY) has always been proud of their response time to fires in New York City, but they want to make the

POJ 1122.FDNY to the Rescue!

FDNY to the Rescue! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2808   Accepted: 860 Description The Fire Department of New York (FDNY) has always been proud of their response time to fires in New York City, but they want to make the

POJ 1122 FDNY to the Rescue!(最短路)

题目链接 FDNY to the Rescue! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3405 Accepted: 1063 Description The Fire Department of New York (FDNY) has always been proud of their response time to fires in New York City, but they want to make t

POJ 1122 FDNY to the Rescue! 反向dijkstra

链接: 1122 题意: 一个城市中有N个交叉路口,给出从一个交叉路口i到另一个交叉路口j所需要的时间(i,j=1~N,单向)如果edge[i][j]=-1 则表示不通 给出一个火警的位置(终点) 和X个消防站(起点) 输出:每一行描述了一个消防站的信息,这些信息按消防站到达火警位置所需时间从小到大排列.这些信息包括:消防站的位置(初始位置).火警位置(目标位置).所需时间以及最短路径上的每个交叉路口. 题解: 起点有多个,终点只有一个.为了只进行一次dijkstra算法 我们可以考虑从终点出发

关于floyd 打印路径的问题

我们令    f[i][j]  表示从 i-->j的最短路上j前面的那个点. 显然初始化时  f[i][j]=i;  (这样的话先判断一下i是否能到达j好点) 更新条件时,当发现通过点k能使最短路径减少,则  f[i][j]=f[k][j]这也是显然的,相当于把k-->j这条路接在了i--->k上,i-->j的倒数第二个点理应是k-->j时候的那个点. #include<bits/stdc++.h>using namespace std;#define inf 0

POJ 1141-Brackets Sequence(区间dp括号匹配打印路径)

题目地址:POJ 1141 题意:给出一串由'(')'' [ ' ' ] '组成的串,将给出的括号序列以添加最小数目括号的形式进行配对. 思路:dp[i][j]表示当前子序列需要添加的最小字符数,path存储的是所有子问题的解.然后详情看代码解释. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #in

poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给出火警位置所在的交叉路口 和 一个或多个消防站所处的交叉路口位置.输出要求按消防站到火警位置所需时间从小到大排列,输出信息包括消防站位置(初始位置),火警位置(目标位置),所需时间,最短路径上每个交叉路口. 题解:反向建图,从火警位置求一次最短路,求最短路时记录路径,按时间从小到大输出. 1 #in

HDU 1385 Minimum Transport Cost(Floyd 最短路 打印路径)

HDU 1385 大意: 有N个城市,然后直接给出这些城市之间的邻接矩阵,矩阵中-1代表那两个城市无道路相连,其他值代表路径长度. 如果一辆汽车经过某个城市,必须要交一定的钱(可能是过路费). 现在要从a城到b城,花费为路径长度之和,再加上除起点与终点外所有城市的过路费之和. 求最小花费,如果有多条路经符合,则输出字典序最小的路径. 思路: Floyd求最短路,打印路径即可. 1 /*--------------------------------------------------------

poj 2965 The Pilots Brothers&#39; refrigerator(dfs 枚举 +打印路径)

链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手,'+'代表关,'-'代表开,当16个把手都为开(即'-')时,门才能打开,问至少要几步门才能打开 改变状态规则:选定16个把手中的任意一个,可以改变其本身以及同行同列的状态(即若为开,则变为关,若为关,则变为开),这一次操作为一步. 分析:这题与poj 1753思路差不多,每个把手最多改变一次状态, 所有整个矩阵最多改变16次状态 思路:直接dfs枚举所有状态,直到找到目标状态 但是要打印路径,所有应在dfs时记录路径 注