PAT 团体程序设计天梯赛-练习集 L2-001. 紧急救援 【dijkstra】

原创 2016年05月31日 19:19:12

题目链接

http://blog.csdn.net/tc_to_top/article/details/51427223

思路

题意是求个最短路,要求路径长度和最短的前提下,点权和最大,并求出长度相等的最短路有几条,并输出路径,是dijkstra的灵活运用。

这种题好像写过很多遍了,但这次还是不能一次过,调试了半天。

点权和最大很好解决,给dis加一个属性就可以了。

输出最短路径,可以用一个数组记录每个点的前驱。

最短路有几条卡了挺久,方法是对每个点设一个cnt记录到这个点的最短路径有几条,
然后每次更新dis,如果路径长相等,就加上前驱点的cnt,否则如果新路径更短,就置为前驱点的cnt。

AC代码

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

const int INF=0x3f3f3f3f;
int w[600];
int g[600][600];
int n,m,s,d;
struct node
{
    node()
    {
        l=INF;
        w=0;
    }
    node(int _l, int _w)
    {
        w=_w;
        l=_l;
    }
    bool friend operator < (node a, node b)
    {
        if(a.l==b.l)
            return a.w>b.w;
        return a.l<b.l;
    }
    int w,l;
}dis[600];
bool vis[600];
int cnt[600];
int pre[600];
void dijkstra(int start)
{
    dis[start].l=0;
    dis[start].w=w[start];
    for(int i=0 ; i<n ; ++i)
    {
        node min_node(INF,0);
        int u=-1;
        for(int j=0 ; j<n ; ++j)
        {
            if(vis[j]==0 && dis[j]<min_node)
            {
                min_node=dis[j];
                u=j;
            }
        }
        for(int v=0 ; v<n ; ++v)
        {
            if(vis[v]==0 && g[u][v]<INF)
            {
                node new_dis=node(dis[u].l+g[u][v], dis[u].w+w[v]);
                if(new_dis.l==dis[v].l)
                {
                    cnt[v]+=cnt[u];
                }
                if(new_dis.l<dis[v].l)
                {
                    cnt[v]=cnt[u];
                }
                if(new_dis<dis[v])
                {
                    dis[v]=new_dis;
                    pre[v]=u;
                }
            }
        }
        vis[u]=1;
    }
}
void init()
{
    for(int i=0 ; i<600 ; ++i) cnt[i]=1;
    memset(g,INF,sizeof g);
    memset(pre,-1,sizeof pre);
}
int main()
{
    init();
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(int i=0 ; i<n ; ++i)
    {
        scanf("%d",&w[i]);
    }
    for(int i=0 ; i<m ; ++i)
    {
        int u,v,l;
        scanf("%d%d%d",&u,&v,&l);
        g[u][v]=g[v][u]=l;
    }
    dijkstra(s);

    int t=d;
    vector<int>ans;
    while(pre[t]!=-1)
    {
        ans.push_back(t);
        t=pre[t];
    }
    ans.push_back(s);

    printf("%d %d\n",cnt[d], dis[d].w);
    for(int i=ans.size()-1 ; i>=0 ; --i)
    {
        if(i==(int)ans.size()-1)printf("%d",ans[i]);
        else printf(" %d",ans[i]);
    }
    printf("\n");
    return 0;
}
版权声明:本文为博主原创文章,转载请务必注明出处。

团体程序设计天梯赛-练习集 L2-001 紧急救援 dijkstra 解题报告

L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作...
  • qq_21899803
  • qq_21899803
  • 2016年06月01日 15:20
  • 1055

PAT天梯赛-L2-001 紧急救援

#include #include #include #include #include #include using namespace std; const int Size=500; cons...
  • qq_17249047
  • qq_17249047
  • 2016年05月30日 19:16
  • 672

PAT 团体天梯赛 L2-001 紧急救援 (迪杰斯特拉)

题意: 中文的就不说了 方法:方法一看就知道 单源最短路径并且维护另外的两个救援人数和方法数就好了 因为习惯了用spfa写 怎么调试都是部分正确 7分的那组测试数据就是过不了 硬是想不到为什么 后...
  • Below_Crusder
  • Below_Crusder
  • 2016年07月07日 21:46
  • 303

L2-001. 紧急救援

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求...
  • dengkuomin
  • dengkuomin
  • 2017年03月21日 20:22
  • 231

Wall(凸包POJ 1113)

Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32360 Accepted: 10969D...
  • huayunhualuo
  • huayunhualuo
  • 2015年08月26日 09:49
  • 255

Fishnet(暴力POJ 1408)

Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1911   Accepted: 1227 ...
  • huayunhualuo
  • huayunhualuo
  • 2015年08月26日 12:25
  • 231

PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感。 L1-1  就不说了。。。 L1-2 打印沙漏  一个变量保存空格数,一个变量保存沙漏符号...
  • woyuhuaijin
  • woyuhuaijin
  • 2016年04月16日 22:06
  • 4175

团体程序设计天梯赛-练习集 L2阶段 全部题解

L2-001. 紧急救援 团体程序设计天梯赛-练习集 L2-001 紧急救援 dijkstra 解题报告 - 小夥的博客 - 博客频道 - CSDN.NET  http://blog.csdn.net...
  • qq_21899803
  • qq_21899803
  • 2017年03月18日 15:15
  • 509

Moving Tables(贪心或Dp POJ1083)

Moving Tables Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28304   Accepted: 9...
  • huayunhualuo
  • huayunhualuo
  • 2015年08月27日 17:02
  • 269

dd大牛的《背包九讲》

P01: 01背包问题 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路...
  • dtwd886
  • dtwd886
  • 2016年05月04日 21:36
  • 141
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PAT 团体程序设计天梯赛-练习集 L2-001. 紧急救援 【dijkstra】
举报原因:
原因补充:

(最多只允许输入30个字)