最短路(Floyd)-hdu1317
题目链接:https://vjudge.net/problem/HDU-1317
题目描述:



题意:玩家起始有100个能量点,刚开始在起始房间中,每个房间外有一条单向的路径通往其他房间(一个房间可能通往多个房间),具体通往哪些房间可以查看房间门口的房间列表。每次玩家进入一个房间,他的能量值会更新成 当前自身能量值+房间能量值(重点是房间的能量值可能为负值)。玩家想要终止游戏的话,要么是能够进入到终点房间,要么是因能量耗尽而累死。需要我们判断玩家能否进入到终点房间。
Floyd算法(Floyd-Warshall algorithm)又称为弗洛伊德算法、插点法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。(百度百科)
因为此题中存在负权值,因此用Floyd最短路来解决。
思路:首先我们需要检查是否存在这样的路从1到达N,如果不存在,直接输出hopeless。我们可以利用floyd算法去检查。Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。因为题中可能会出现负周期——行成环路,可以无限增加能量值。但是可以用于检查1到N是否连通。然后我们再使用Bellman算法,如果松弛N-1次后,任然存在更新。说明图中存在负周期,说明能量可以无限叠加,检查环路的点是否与N连通就行了。如果不存在负周期,则检查到达N的能量是否大于0。转载自博文:https://blog.csdn.net/rainbow_storm/article/details/81263440
代码实现:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N,M;
const int MAXN =;
const int INF = 0x3f3f3f3f;
/* d数组表示到达i房间的最大的能量值;
p数组表示每个房间的能量值;
G数组存图。G[i][j]=1,表示i到j有1条通路。
E数组存边。
*/
struct edge{
int from,to;
}E[MAXN*MAXN];
int d[MAXN],P[MAXN];
int G[MAXN][MAXN];
bool floyd()//判断是否房间之间是可达的,如不可达,则输出hopeless
{
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
if(G[i][k]&&G[k][j])
G[i][j]=;
return G[][N];
} bool bellman(){
fill(d,d+MAXN,-INF);
d[]=;//初始值为100
for(int i=;i<N;i++)
{
bool flag=false;
for(int j=;j<M;j++){
if(d[E[j].to] < d[E[j].from]+P[E[j].to] && d[E[j].from]+P[E[j].to]>){
flag=true;
d[E[j].to]=d[E[j].from]+P[E[j].to];
}
}
if(!flag) break;
}
for(int j=;j<M;j++){
if(d[E[j].to] < d[E[j].from]+P[E[j].to] && d[E[j].from]+P[E[j].to]>){
d[E[j].to]=d[E[j].from]+P[E[j].to];
if(G[E[j].to][N]){
return true;
}
}
}
return d[N]>;
} int main(){
while(~scanf("%d",&N)&&(N!=-)){
memset(G,,sizeof(G));
memset(E,,sizeof(E));
memset(P,,sizeof(P));
M=;
int con;//记录连接多少扇门
for(int i=;i<=N;i++){
scanf("%d%d",&P[i],&con);
for(int j=;j<=con;j++){
int tmp;scanf("%d",&tmp);
E[M++]=(edge){i,tmp};
G[i][tmp]=;//说明从门i到门tmp是可达的
}
}
if(!floyd()){
printf("hopeless\n");
continue;
}
if(bellman()){
printf("winnable\n");
}else{
printf("hopeless\n");
}
}
return ;
}
最短路(Floyd)-hdu1317的更多相关文章
- ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)
		这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ... 
- 模板C++ 03图论算法 2最短路之全源最短路(Floyd)
		3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ... 
- 最短路 - floyd算法
		floyd算法是多源最短路算法 也就是说,floyd可以一次跑出所以点两两之间的最短路 floyd类似动态规划 如下图: 用橙色表示边权,蓝色表示最短路 求最短路的流程是这样的: 先把点1到其他点的最 ... 
- HDU1869---(最短路+floyd)
		http://acm.hdu.edu.cn/showproblem.php?pid=1869 思路:最短路+floyd 分析:1 题目是要求所有的数据能否满足“六度分离”,那么我们就想到所有点之间的最 ... 
- 【bzoj2324】[ZJOI2011]营救皮卡丘  最短路-Floyd+有上下界费用流
		原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ... 
- 【ACM程序设计】求短路 Floyd算法
		最短路 floyd算法 floyd是一个基于贪心思维和动态规划思维的计算所有点到所有点的最短距离的算法. P57-图-8.Floyd算法_哔哩哔哩_bilibili 对于每个顶点v,和任一顶点对(i, ... 
- poj 3613 经过k条边最短路 floyd+矩阵快速幂
		http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ... 
- 最短路--floyd算法模板
		floyd算法是求所有点之间的最短路的,复杂度O(n3)代码简单是最大特色 #include<stdio.h> #include<string.h> ; const int I ... 
- poj 3216 Repairing Company(最短路Floyd + 最小路径覆盖 + 构图)
		http://poj.org/problem?id=3216 Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Su ... 
- Cogs 309. [USACO 3.2] 香甜的黄油  dijkstra,堆,最短路,floyd
		题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★ 输入文件:butter.in 输出文件 ... 
随机推荐
- oracle 在C# 中调用oracle的数据库时,出现引用库和当前客户端不兼容的问题解决方案
			oracle 在C# 中调用oracle的数据库时,出现引用库和当前客户端不兼容的问题解决方案 解决方案 1.直接引用 Oracle.ManagedDataAccess.Client.dll动态库即 ... 
- Java感情
			不知道怎么会执着于这一门语言.论速度的话,c那系更好一些,而且对底层的操控更多是c那边的.还是想通过Java做这些事. 对Java不怎么懂,它的底层实现是怎样的.只知道一个大体的思想,不知道具体步骤. ... 
- Confluence 6 配置索引语言
			修改你 Confluence 的索引语言将有助于你提高搜索的准确性,如果你网站使用的主要语言是除了英语以外的其他语言. Confluence 可以支持下面语言的的内容索引: Arabic Brazil ... 
- java多线程快速入门(二十)
			1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ... 
- Nginx详解二十三:Nginx深度学习篇之Nginx+Lua开发环境搭建
			Nginx+Lua开发环境 1.下载LuaJIT解释器wget http://luajit.org/download/LuaJIT-2.0.2.tar.gztar -zxvf LuaJIT-2.0.2 ... 
- selenium 操作键盘
			send_keys(Keys.ENTER) 按下回车键send_keys(Keys.TAB) 按下Tab制表键send_keys(Keys.SPACE) 按下空格键spacesend_keys(Kye ... 
- Python练习题
			内置函数 # 5.随意写一个20行以上的文件# 运行程序,先将内容读到内存中,用列表存储.# 接收用户输入页码,每页5条,仅输出当页的内容 def user_check(filename,num=5) ... 
- python的相关基本操作
			1.安装第三方库:pip install requests 2.升级:pip install --upgrade library_name 3.升级所有已安装的库: pip list --outdat ... 
- IDEA项目的复制操作
			另一种复制项目的方法 完成 
- 牛客寒假算法基础集训营4 I题 Applese 的回文串
			链接:https://ac.nowcoder.com/acm/contest/330/I 来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如--判断一个字符串是不是回文串. ... 
