最短路模板题 51nod1459(dijkstra)

1459 迷宫游戏 

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

 收藏

 关注

你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么?

Input

第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。
第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
再接下来m行,每行3个空格分隔的整数x, y, z (0<z<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间, 你需要的时间为z。
输入保证从start到end至少有一条路径。

Output

一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。

Input示例

3 2 0 2
1 2 3
0 1 10
1 2 11

Output示例

21 6

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f
using namespace std;
int maxn[505],score[505],map[505][505],d[505],visit[505];
//d[i]为点i到起点s的最小花销时间,maxn[i]为点i到s最大分数
int n,m,s,e;

void init()
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            map[i][j]=inf;
    memset(visit,0,sizeof(visit));
}
void dijkstra()
{
    for(int i=0;i<n;i++)//初始化d和maxn
    {
        d[i]=map[s][i];
        if(map[s][i]!=inf&&i!=s)//点i与起点s有直接路径则maxn为连点分数相加
            maxn[i]=score[i]+score[s];
        else//没有直接路径则maxn为起点分数,本身的分数等有间接路径是在用
            maxn[i]=score[s];
    }
    d[s]=0;
    visit[s]=1;
    for(int i=1;i<n;i++)//还有n-1点为处理,最多循环n-1次
    {
        int min1=inf,flag;
        for(int j=0;j<n;j++)//找到与点s最短的一条路
        {
            if(!visit[j]&&min1>d[j])
            {
                min1=d[j];
                flag=j;//标记最短顶点
            }
        }
        visit[flag]=1;
        for(int j=0;j<n;j++)//更新为访问过可以间接与点s连接的点的最短路径d
        {
            if(!visit[j])
            {
                if(d[j]==d[flag]+map[flag][j])//如果直接路径与间接路径d相同要去最大分数
                    maxn[j]=max(maxn[j],maxn[flag]+score[j]);
                else if(d[j]>map[flag][j]+d[flag])//更新通过中转点flag,点j到s最短路径d
                {
                    d[j]=map[flag][j]+d[flag];
                    maxn[j]=maxn[flag]+score[j];
                }
            }
        }
        if(visit[e])//如果已经访问到了终点e,直接返回
            return ;
    }
}
int main()
{
    while(cin>>n>>m>>s>>e)
    {
        init();
        for(int i=0;i<n;i++)
            cin>>score[i];
        for(int i=0;i<m;i++)
        {
            int a,b,x;
            cin>>a>>b>>x;
            if(map[a][b]>x)
            map[a][b]=map[b][a]=x;
        }
        dijkstra();
        printf("%d %d\n",d[e],maxn[e]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/xiongtao/p/9094188.html

时间: 2024-08-29 17:00:07

最短路模板题 51nod1459(dijkstra)的相关文章

poj1511/zoj2008 Invitation Cards(最短路模板题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds      Memory Limit: 65536 KB In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fa

HDU 5521.Meeting 最短路模板题

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 3361    Accepted Submission(s): 1073 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Jo

[poj2449]Remmarguts&#39; Date(K短路模板题,A*算法)

解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=1e3+10; const

Til the Cows Come Home (最短路模板题)

个人心得:模板题,不过还是找到了很多问题,真的是头痛,为什么用dijkstra算法book[1]=1就错了..... 纠结中.... Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so s

hdu1874 最短路模板题

之所以做了第二道模板题还要写是因为发现了一些自己的问题 用的是dij 最简单的松弛 需要注意的地方是松弛的时候 判断dis[i]<dis[w]+tance[w][i]时 还要再判断 vis[i] 要保证这个点没有成为过最小点 即这个点不会是已经被松弛过的点 输入的时候要注意 可能会有重边的输入 每次输入的时候进行一次判断 如果输入的是较大值 就不用更换了 关于memset的使用 它只能用来设置0与-1 别的值会出现莫名的错误 #include<stdio.h> #include<s

HDU 2544 - 最短路 - [堆优化dijkstra][最短路模板题]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可

poj 1847 最短路简单题,dijkstra

1.poj  1847  Tram   最短路 2.总结:用dijkstra做的,算出a到其它各个点要改向的次数.其它应该也可以. 题意: 有点难懂.n个结点,每个点可通向ki个相邻点,默认指向第一个相邻点,可以改变指向.求一条从A到B的路,使用最少改变路上点的指向的次数. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm>

poj 2387 最短路模板题

Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the morning milking. Bessie needs her beauty sleep, so she wants to get back as quickly as possible. Farmer John's field ha

AC日记——热浪 codevs 1557 (最短路模板题)

1557 热浪 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦. FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线.