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. [CF912A]Tricky Alchemy

    题意:你有a个黄水晶和b个蓝水晶,要求要x个黄水晶球(2黄),y个绿水晶球(1黄1蓝),z个蓝水晶球(3蓝),问还要多少水晶题解:模拟 C++ Code: #include<cstdio> ...

  2. 【COGS 461】[网络流24题] 餐巾 最小费用最大流

    既然是最小费用最大流我们就用最大流来限制其一定能把每天跑满,那么把每个表示天的点向T连流量为其所需餐巾,费用为0的边,然后又与每天的餐巾对于买是无限制的因此从S向每个表示天的点连流量为INF,费用为一 ...

  3. bzoj2827: 千山鸟飞绝 平衡树 替罪羊树 蜜汁标记

    这道题首先可以看出坐标没有什么意义离散掉就好了. 然后你就会发现你要每次都更改坐标,而一旦更改受影响的是坐标里的所有数,要是一个一个的改,会不可描述. 所以换个视角,我们要找的是某只鸟所到每个坐标时遇 ...

  4. React & Redux 的一些基本知识点

    一.React.createClass 跟 React.Component 的区别在于后者使用了ES6的语法,用constructor构造器来构造默认的属性和状态. 1. React.createCl ...

  5. [poj 2104]主席树+静态区间第k大

    题目链接:http://poj.org/problem?id=2104 主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即 ...

  6. BZOJ1798 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 8058  Solved: 2964[Submit ...

  7. JVM 性能排查--查看哪个对象占用内存大

    参考:http://blog.csdn.net/chenleixing/article/details/44227327/ 1.  在IE地址栏中输入:http://localhost/test/in ...

  8. 【跑马灯】纯css3跑马灯demo

    我们写跑马灯一般都是用js控制定时器不断循环产生,但是定时器消耗比较大,特别是程序中很多用到定时器的时候,感觉有的时候比较卡.但是css3样式一般不会.这里主要的思路就是用css3代替js定时器实现一 ...

  9. CSS3 渐变(Gradients)

    参考: http://www.runoob.com/css3/css3-gradients.html CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必 ...

  10. mysql五:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...