51nod 1459 迷宫游戏【最短路拓展】
第一行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至少有一条路径。
一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。
3 2 0 2
1 2 3
0 1 10
1 2 11
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 迷宫游戏【最短路拓展】的更多相关文章
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
- 51nod 1459 迷宫游戏 dijkstra模板
链接:迷宫游戏 问题 - 51Nod http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 1459 迷宫游戏 基准 ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
- 51 NOd 1459 迷宫游戏 (最短路径)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...
- 51Nod 1459:迷宫游戏(最短路)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...
- 51nod--1459 迷宫游戏 (dijkstra)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可 ...
- 51nod1459 迷宫游戏
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你 ...
- c语言迷宫游戏的实现
// // main.c // 迷宫游戏代码实现 // #include <stdio.h> #define ROW 6 //宏定义行 #define COL 6 //宏定义列 /** * ...
- 用webgl打造自己的3D迷宫游戏
用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam 背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...
随机推荐
- 【题解】HNOI2017大佬
哎……做了几个小时最后还是没能想到怼大佬的合法性到底怎么搞.写暴力爆搜感觉复杂度爆炸就没敢写 bfs / dfs 一类,后来发现在种种的约束条件下(远小于所给的 \(n, m\))复杂度完全是可以承受 ...
- [洛谷P3376]【模板】网络最大流(ISAP)
C++ Code:(ISAP) #include <cstdio> #include <cstring> #define maxn 1210 #define maxm 1200 ...
- [洛谷P3690]【模板】Link Cut Tree (动态树)
题目大意:给定$n$个点以及每个点的权值,要你处理接下来的$m$个操作.操作有$4$种.操作从$0到3编号.点从1到n编号. $0,x,y$:代表询问从$x$到$y$的路径上的点的权值的$xor$和. ...
- springboot 实现自定义注解
1.定义一个注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface T ...
- STL map、set中key为结构体的用法
下面是map定义的结构: // TEMPLATE CLASS map template<class _Kty, class _Ty, class _Pr = less<_Kty>, ...
- [Leetcode] subsets 求数组所有的子集
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...
- 洛谷 P1502 窗口的星星 解题报告
P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...
- android脱壳之DexExtractor原理分析
导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1. 需要动态调试 2. 对抗反调试方案 为了提高工作效率, ...
- CI框架浅析
CI框架浅析(全篇) 业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...
- Lesson 3
1.关于面向对象的三个重要属性 Encapsulation(封装):无法直接访问类的成员变量,而是通过一些get set方法,间接访问数据域: Polymorphism(多态):静态绑定,动态绑定, ...