POJ 1122 FDNY to the Rescue! 反向dijkstra

链接:

1122

题意:

一个城市中有N个交叉路口,给出从一个交叉路口i到另一个交叉路口j所需要的时间(i,j=1~N,单向)如果edge[i][j]=-1 则表示不通

给出一个火警的位置(终点) 和X个消防站(起点)

输出:每一行描述了一个消防站的信息,这些信息按消防站到达火警位置所需时间从小到大排列。这些信息包括:消防站的位置(初始位置)、火警位置(目标位置)、所需时间以及最短路径上的每个交叉路口。

题解:

起点有多个,终点只有一个。为了只进行一次dijkstra算法 我们可以考虑从终点出发

如果是无向图 终点到起点和起点的距离是一样的。

而如果是有向图,只要进行一点小改动即可:在dij算法中将邻接矩阵edge[i][j] i和J的位置互换。路径则用path存  终点保存-1终止

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxx   0x3f3f3f3f
int map[25][25];
int dis[25];
int vis[25];
int path[25];
struct node
{
    int pos;
    int ans;                       //每个起点的时间排序
} endd[25];
int m,start;
int cmp(node a,node b)
{
    return a.ans<b.ans;
}
void dij()
{
    int i,j,loc,minn;
    for(i=1; i<=m; i++)
    {
        dis[i]=map[i][start];              //i,j互换
        path[i]=start;
        vis[i]=0;
    }
    vis[start]=1;
    path[start]=-1;
    for(i=1; i<m; i++)
    {
        minn=maxx;
        for(j=1; j<=m; j++)
            if(!vis[j]&&dis[j]<minn)
                minn=dis[j],loc=j;
        vis[loc]=1;
        for(j=1; j<=m; j++)
            if(!vis[j]&&dis[j]>dis[loc]+map[j][loc])         //i,j互换
            {
                dis[j]=dis[loc]+map[j][loc];
                path[j]=loc;
            }
    }
    return;
}
int main()
{
    int i,j,t,n,s=0;
    scanf("%d",&m);
    for(i=1; i<=m; i++)
        for(j=1; j<=m; j++)
        {
            scanf("%d",&map[i][j]);
            if(map[i][j]==-1)
                map[i][j]=maxx;
        }
    scanf("%d",&start);
    dij();
    while(~scanf("%d",&endd[s].pos))
    {
        endd[s++].ans=dis[endd[s].pos];
    }
    sort(endd,endd+s,cmp);
    printf("Org\tDest\tTime\tPath\n");
    for(i=0;i<s;i++)
    {
        printf("%d\t%d\t%d",endd[i].pos,start,endd[i].ans);
        j=endd[i].pos;
        while(j!=-1)
        {
            printf("\t%d",j);
            j=path[j];
        }
        cout<<endl;
    }
    return 0;
}
时间: 2024-10-26 11:28:30

POJ 1122 FDNY to the Rescue! 反向dijkstra的相关文章

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! Floyd 打印路径就行了

题目大意: 纽约消防部门的支援速度是值得纽约人骄傲的一件事.但是他们想要最快的支援速度,帮助他们提升支援速度他们要调度离着火点最近的一个消防站.他们要你写一个程序来维护纽约消防站的光荣传统.软件需要有的功能是,能获取着火点的地址 和 消防站的位置, 街道交叉路口, 从一个交叉路口到达另一个交叉路口的时间. 他将要计算从消防站到达着火点需要多少时间. 给你一个具体的着火点的地址,这个软件应该找出所有消防站到达着火点的距离, 并且从小到大进行排序.以便消防员来调度人员到达救火地点. #include

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

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

POJ 2387 Til the Cows Come Home dijkstra算法 用邻接表和邻接矩阵

题目如下: Til the Cows Come Home Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 27726        Accepted: 9353 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wa

poj 2387 Til the Cows Come Home(dijkstra算法)

题目链接:http://poj.org/problem?id=2387 题目大意:起点一定是1,终点给出,然后求出1到所给点的最短路径. 注意的是先输入边,在输入的顶点数,不要弄反哦~~~ 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int map[2010][2010],Min,node[2010],vis[2010],t,q; 5 const int INF=9999999; 6 7 vo

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n,树根为编号1,选择一些边,使得所有节点构成一棵树,选择边的代价是(子孙的点的重量)×(这条边的价值).求代价最小多少. 分析: 单看每个点被计算过的代价,很明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 不过坑点还是很多的. 点的数量高达5w个,用矩阵存不行,只能用边存. 还有路径和结

POJ 2394 Checking an Alibi (最短路+Dijkstra)

Checking an Alibi Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6217   Accepted: 2257 Description A crime has been comitted: a load of grain has been taken from the barn by one of FJ's cows. FJ is trying to determine which of his C (1