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. [bzoj2621] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目链接 状压\(dp\) 根据套路,先设\(f[sta]\)为状态为\(sta\)时所用的最小分组数. 可以发现,这个状态不好转移,无法判断是否可以装下新的一个物品.于是再设一个状态\(g[sta] ...

  2. [IOI2007 D1T1]Miners 矿工配餐

    题目大意:有$2$个煤矿,$n$天.每天给一个煤矿送餐(共有有$3$种餐),价值为它与前面两次送餐(如果有的话)不同的种类数.最大化价值. 题解:看到只有三种餐,考虑状压$DP$.$f_{i,j,k, ...

  3. BZOJ2115 [Wc2011] Xor 【线性基】

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 3915  Solved: 1633 [Submit][Stat ...

  4. POJ2236:Wireless Network(并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 39772   Accepted: 164 ...

  5. 在Ubuntu下编译WebKit源码--qt

    转载自:http://www.cnblogs.com/panderen/archive/2011/10/18/2216154.html 在朋友的介绍下有幸認识了WebKit这个让人心动的开源浏览器内核 ...

  6. 【转载】深入理解PHP Opcode缓存原理

    转载地址:深入理解PHP Opcode缓存原理 什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).O ...

  7. xml数据格式

    <?xml version="1.0" encoding="utf-8"?> <country> <name>中国</ ...

  8. Hibernate 懒加载 错误----no session

    错误: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa org.hibernate.LazyI ...

  9. c#之字符串函数

    1.常用的字符串函数 Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 int Compare(string str1,string str2) int Compare(s ...

  10. 基于MapReduce的手机流量统计分析

    1,代码 package mr; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org. ...