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. WPS是个坑

    WPS2016 10.1.0.5740 存储的EXCEL表格文件,用PHP mime_content_type函数获取到的mime类型是“application/zip”

  2. HDU1272:小希的迷宫(并查集)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. ng依赖注入

    依赖注入 1.注入器在组件的构造函数中写服务constructor(private httpreq:HttpService) { } 2.提供器 providers: [HttpService],

  4. bzoj4589 FWT xor版本

    4589: Hard Nim Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 865  Solved: 484[Submit][Status][Disc ...

  5. iOS 后台运行执行代码(例如定位)

  6. rpmdb open failed解决方案

    1.前提条件:安装软件包的时候,被我手动终止了(可能出错原因)[root@dhcp yum.repos.d]# yum clean allrpmdb: Thread/process 4541/1406 ...

  7. [51nod] 1305 Pairwise Sum and Divide 数学

    有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:   fun(A)     sum = 0     for i = 1 to A.length         for j = ...

  8. [洛谷P2124] 奶牛美容

    洛谷题目链接:奶牛美容 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 6 16 ................ ..XXXX....XXX... ...XXXX... ...

  9. kettle基础操作

    ETL:抽取(extract).转换(transform).加载(load)至目的端的过程: Kettle是ETL工具代表之一,是pentaho中的一个数据整合的一个组件.Kettle里包括多个Job ...

  10. css划斜线

    http://stackoverflow.com/questions/18012420/draw-diagonal-lines-in-div-background-with-css