51nod 1459 迷宫游戏(迪杰特斯拉Dijkstra算法)

原创 2016年08月30日 18:50:30

题目:

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

这个是51nod的第一道基础题,还算是比较水的,我不是菊苣啊,但是我想说一下我的意见,就是一般的ACMer不要看不起基础题啊!我一开始就是抱着“啊你们都是基础题一群乌合之众劳资就是拿你们练手速的看劳资秒了你们!”的态度打开了基础题,然后等我做的时候就傻眼了,题目倒是确实挺基础的恩,但问题是有些算法我不会呀啊啊啊啊!T0T!反正本人是用了3天时间才撸完了基础题,中间实在想不出的两三道题还看了下别人菊苣的博客,辣鸡得抠脚啊!所以推荐大家还是把基础题全部补完,这样可以补牢自己的基本功^0^。


好了,废话不多说了。让我们来正式看看这道题吧。

本题的思路就是用Dijkstra算法求最短路,只不过多了一个在满足最短路的情况下,使得分最大,easy,只要用一个sum数组把得分存起来就行了,搜索的时候,如果路径权值相同的话,就比较哪条路径的权值大,如果新加上路的话就把那个房间的分数加在sum上就可以了。好了,直接上代码吧,这题目还是比较水的~= ̄ω ̄=。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxx 999999
int map[501][501];
int n,m,st,en,f[501],mark[501],sum[501],a[501];
void Dijkstra()
{
   int i,j,k,min;
   memset(mark,0,sizeof(mark));
   sum[st]=a[st];
   for(i=0;i<n;i++)
   {
       f[i]=map[st][i];
   }
   f[st]=0;
   for(i=0;i<n;i++)
   {
       min=maxx;
       for(j=0;j<n;j++)//找出第i个离起点最近的距离,找到后把此点标记为k,mark[k]=1,表示要走这段路了,以后不再找了 
       {
           if(!mark[j]&&f[j]<min)
           {
               min=f[j];
               k=j;
           }
       }
       if(min==maxx)break;//没路了就跳出 
       mark[k]=1;
       for(j=0;j<n;j++)
       {
           if(!mark[j]&&f[j]>=f[k]+map[k][j])
		   {
		   	//	printf("%d %d %d %d %d %d\n",i,j,k,f[j],f[k],map[k][j]);
		   	   if(f[j]==f[k]+map[k][j])
		   	   {
		   	   		sum[j]=max(sum[j],sum[k]+a[j]);  
		   	   }
		   	   else
		   	   {
              	    f[j]=f[k]+map[k][j];
              	    sum[j]=sum[k]+a[j];
               }
           }
       }
   }
   if(f[en]!=maxx)printf("%d %d\n",f[en],sum[en]);
   else printf("-1\n");
}
int main()
{
    int x,y,z,i,j;
    while(scanf("%d%d%d%d",&n,&m,&st,&en)!=EOF)
    {
        for(i=0;i<=n-1;i++)
            for(j=0;j<=n-1;j++)
                map[i][j]=maxx;//map[i][j]表示从i到j所要花费的距离 
        for(i=0;i<n;i++)
        {
       		scanf("%d",&a[i]);
        }
        for(i=1;i<=m;i++)
        {
            scanf("%d %d %d",&x,&y,&z);
            if(map[x][y]>z)
            {map[x][y]=map[y][x]=z;}
        }
        Dijkstra();
    }
    return 0;
}





51nod 1459 迷宫游戏

1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,...
  • qq_32734731
  • qq_32734731
  • 2016年12月08日 19:24
  • 320

Dijkstra算法详解

1.dijkstra算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法。算法解决的是有向图中单...
  • longshengguoji
  • longshengguoji
  • 2013年08月31日 19:03
  • 110107

最短路径 [迪杰特斯拉算法] --->图

在网图和非网图中,最短路径的含义是不同的。      -网图是两定点经过的边打上权值之和最少的路径。      -非网图是两顶点之间经过的边数最少的路径。 我们把路径起始的第一个顶点称为源点,最后一个...
  • luobo140716
  • luobo140716
  • 2016年07月05日 12:59
  • 1592

求最短路径长度-迪杰特斯拉算法

求最短路径长度-迪杰特斯拉算法   Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 ...
  • Maybe2030
  • Maybe2030
  • 2015年03月29日 21:39
  • 4168

深入理解Dijkstra(迪杰斯特拉)算法(正确思路+优化+原理)

这里需要一个很好的例子,这里先拿网上流传的例子作为反例。 问题1:不符合勾股定理 AC=3,CB=2,AB=6 难道这样真的无伤大雅吗?假设你的起点是A,终点是B,难道不...
  • qq_36523667
  • qq_36523667
  • 2017年12月12日 11:51
  • 151

Dijkstra迪杰斯特拉算法及C++实现

Dijkstra迪杰斯特拉算法及C++实现
  • mimi9919
  • mimi9919
  • 2016年04月22日 22:13
  • 6207

dijkstra算法模板(优先队列优化)

dijkstra算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有 向图中最短路径问题。迪杰斯特拉算法主要特点是以起...
  • JobsandCzj
  • JobsandCzj
  • 2015年11月21日 10:42
  • 4685

迪杰斯特拉算法Java实现

public class Dijkstra { static int MAX=10000; public static void main(String[] args) { ...
  • wangshuang1631
  • wangshuang1631
  • 2016年09月23日 13:45
  • 2723

Dijkstra和Prim算法 【含数学证明】

#ACM&算法 不知是不是因为自己的抽象学习能力还是不够强,之前在翻阅别人博客学习这两个算法的时候,整个人一直处于懵逼状态。 分析了一下,发现之前存在的博客教程,大多趋向于方法讲解,学完以后有知其...
  • Reskip
  • Reskip
  • 2016年02月17日 20:10
  • 6515

Dijkstra算法-(迪杰斯特拉)算法的迭代实现与优先队列实现 图解算法过程

Dijkstra算法-(迪杰斯特拉)算法之迭代实现 Dijkstra算法-(迪杰斯特拉)算法之优先队列实现...
  • collonn
  • collonn
  • 2014年01月11日 23:51
  • 6786
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod 1459 迷宫游戏(迪杰特斯拉Dijkstra算法)
举报原因:
原因补充:

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