1459 迷宫游戏

基准时间限制:1 秒 空间限制:131072 KB
 
你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一 些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、 道路、分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么?
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<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
#define inf 0x3f3f3f3f int mp[maxn][maxn],vis[maxn],dis[maxn];
int tm[maxn],ans[maxn];// 结点权值+最短路径结点权值和
int n,m,st,ed;
int x,y,z; void dij()
{ for(int i=;i<n;i++) /*初始化*/
dis[i]=mp[st][i];
dis[st]=;
ans[st]=tm[st]; int pos; /*记录位置*/
int minn;
for(int i=;i<n;i++)
{
minn=inf; /*找最短路径*/
for(int j=;j<n;j++)
if(!vis[j] && dis[j] < minn)
minn=dis[pos=j]; vis[pos]=; for(int j=; j<n; j++) /*松弛操作更新节点最短到达距离*/
{
if( !vis[j] && dis[pos] + mp[pos][j] < dis[j] )
{
dis[j] = dis[pos] + mp[pos][j];
ans[j] = ans[pos] + tm[j];
}
else if( !vis[j] && dis[pos] + mp[pos][j] == dis[j])
ans[j] = max(ans[j], ans[pos]+tm[j] ); /*若路径花费相等,点权取大者*/
}
} } int main()
{
scanf("%d%d%d%d",&n,&m,&st,&ed);
memset(vis,,sizeof(vis)); //初始化数组
memset(ans,,sizeof(ans)); //距离无穷大
memset(mp,inf,sizeof(mp)); //地图实际距离无穷大
for(int i=;i<n;i++) scanf("%d",&tm[i]);
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
mp[x][y]=mp[y][x]=z;
}
dij();
printf("%d %d\n",dis[ed],ans[ed]);
return ;
}

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
#define inf 0x3f3f3f3f int mp[maxn][maxn],vis[maxn],dis[maxn];
int tm[maxn],ans[maxn];// 结点权值+最短路径结点权值和
int n,m,st,ed;
int x,y,z; /*void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mp[i][j]=(i==j)?0:inf;
}*/ void dij(int st)
{
ans[st]=tm[st];
memset(vis,,sizeof(vis)); /*for(int i=0;i<n;i++)
dis[i]=mp[st][i];*/
for (int i = ; i < n; ++i)
{
if (mp[st][i]<inf)
ans[i]=ans[st]+tm[i];//更新得分
dis[i]=mp[st][i];
}
dis[st]=;/*选定源点把距离标为0,可以带参数,有的直接把0当作源点*/
vis[st]=; int pos;/*记录位置*/
int minn;
for(int i=;i<n;i++)
{
minn=inf;
for(int j=;j<n;j++)
{
if(!vis[j] && dis[j] < minn)
{
minn=dis[j];
pos=j;
}
}
vis[pos]=; for(int j=; j<n; j++) /*松弛操作*/
{
if( !vis[j] && dis[pos] + mp[pos][j] < dis[j] )
{
dis[j] = dis[pos] + mp[pos][j];
ans[j] = ans[pos] + tm[j];
}
else if( !vis[j] && dis[pos] + mp[pos][j] == dis[j])
ans[j] = max(ans[j], ans[pos]+tm[j] ); //若路径花费相等,点权取大者
}
} }//更新节点最短到达距离 int main()
{
scanf("%d%d%d%d",&n,&m,&st,&ed);
//memset(vis,0,sizeof(vis));//初始化
//memset(ans,0,sizeof(ans));//距离无穷大
memset(mp,inf,sizeof(mp));//地图实际距离无穷大
//init();
for(int i=;i<n;i++) scanf("%d",&tm[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
mp[x][y]=mp[y][x]=z;
}
dij(st);
printf("%d %d\n",dis[ed],ans[ed]);
return ;
}
 

51nod 1459 迷宫游戏【最短路拓展】的更多相关文章

  1. 51nod 1459 迷宫游戏(dij)

    题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...

  2. 51nod 1459 迷宫游戏 dijkstra模板

    链接:迷宫游戏 问题 - 51Nod  http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 1459 迷宫游戏  基准 ...

  3. 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)

    题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...

  4. 51 NOd 1459 迷宫游戏 (最短路径)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  5. 51Nod 1459:迷宫游戏(最短路)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  6. 51nod--1459 迷宫游戏 (dijkstra)

    1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可 ...

  7. 51nod1459 迷宫游戏

    1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你 ...

  8. c语言迷宫游戏的实现

    // // main.c // 迷宫游戏代码实现 // #include <stdio.h> #define ROW 6 //宏定义行 #define COL 6 //宏定义列 /** * ...

  9. 用webgl打造自己的3D迷宫游戏

    用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam    背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...

随机推荐

  1. JQuery排错关于$(document).ready(function(){});

    最近写了好多JQuery.也出了很多问题.不知道怎么回事.程序就不往下执行了.很是郁闷. 查了下资料,这里可能会有以下几种原因:1.js文件的引用路径不正确,特别是使用了命名空间,容易造成路径错误,使 ...

  2. [洛谷P2568]GCD

    题目大意:给你$n(1\leqslant n\leqslant 10^7)$,求$\displaystyle\sum\limits_{x=1}^n\displaystyle\sum\limits_{y ...

  3. 常见编程语言对REPL支持情况小结

    最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”.当然这个观点有点偏激,但我们可以探究一下,我们常用的编程语言里面,哪些支持REPL,哪些不支持,还有REPL的一 ...

  4. Kafka配置文档

    http://kafka.apache.org/08/configuration.html

  5. ext4文件系统由文件的inode号定位其inode Table

    在ubuntu中(以16.06为例),stat filename 可以查看文件的inode数值,但是如何确定该inode项具体在哪个块组下的inode Table中不是那么容易,接下来通过一步步计算来 ...

  6. Java并发编程--ThreadPoolExecutor

    概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...

  7. 【Foreign】无聊的计算姬 [Lucas][BSGS]

    无聊的计算姬 Time Limit: 10 Sec  Memory Limit: 256 MB Description Input Output Sample Input 6 2 2 3 4 3 2 ...

  8. 汕头市队赛 C SRM 05 - YYL 杯 R1 T3!

    C SRM 05 - YYL 杯 R1 背景 tjmak 描述 给一个大小为n的序列V.序列里的元素有正有负.问至少要删除多少个元素使得序列里不存在区间(要求非空)和 >= S.如果答案大于m, ...

  9. Laravel - Property [title] does not exist on this collection instance

    When you're using get() you get a collection. In this case you need to iterate over it to get proper ...

  10. 会话Cookie

    Cookie分为会话Cookie和本地Cookie两种 之前一直理解的是会话Cookie不在本地文件存储,只存储于内存,而本地Cookie因为设置了expire过期时间需要在本地存储 下面是白帽子讲W ...