题目链接: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的更多相关文章

  1. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  2. 模板C++ 03图论算法 2最短路之全源最短路(Floyd)

    3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...

  3. 最短路 - floyd算法

    floyd算法是多源最短路算法 也就是说,floyd可以一次跑出所以点两两之间的最短路 floyd类似动态规划 如下图: 用橙色表示边权,蓝色表示最短路 求最短路的流程是这样的: 先把点1到其他点的最 ...

  4. HDU1869---(最短路+floyd)

    http://acm.hdu.edu.cn/showproblem.php?pid=1869 思路:最短路+floyd 分析:1 题目是要求所有的数据能否满足“六度分离”,那么我们就想到所有点之间的最 ...

  5. 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...

  6. 【ACM程序设计】求短路 Floyd算法

    最短路 floyd算法 floyd是一个基于贪心思维和动态规划思维的计算所有点到所有点的最短距离的算法. P57-图-8.Floyd算法_哔哩哔哩_bilibili 对于每个顶点v,和任一顶点对(i, ...

  7. poj 3613 经过k条边最短路 floyd+矩阵快速幂

    http://poj.org/problem?id=3613 s->t上经过k条边的最短路 先把1000范围的点离散化到200中,然后使用最短路可以使用floyd,由于求的是经过k条路的最短路, ...

  8. 最短路--floyd算法模板

    floyd算法是求所有点之间的最短路的,复杂度O(n3)代码简单是最大特色 #include<stdio.h> #include<string.h> ; const int I ...

  9. poj 3216 Repairing Company(最短路Floyd + 最小路径覆盖 + 构图)

    http://poj.org/problem?id=3216 Repairing Company Time Limit: 1000MS   Memory Limit: 131072K Total Su ...

  10. Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd

    题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★   输入文件:butter.in   输出文件 ...

随机推荐

  1. grep匹配某个次出现的次数

    cat file | grep  -c 'xxx'  统计xxx在file中出现的行数 cat file | grep  -o 'xxx'  统计xxx在file中出现的次数

  2. Confluence 6 PostgreSQL 输入你的数据库细节

    在 Confluence 的设置安装向导中,将会指导你 Confluence 如何连接到你的数据库.请确定选择 "My own database". 使用 JDBC 连接(默认) ...

  3. Confluence 6 浏览默认的 Decorators

    在任何时候,你都可以使用 "Site Layouts" 页面中的 "View Default" 来浏览默认的 decorator 文件.模板浏览器允许你查看使用 ...

  4. nginx安装编译参数

  5. Rational Rose 2007下载、安装和破解

    一.文件下载 (1)DAEMON Tools Lite(虚拟光驱)下载地址 链接:https://pan.baidu.com/s/19L1FT6T1MlyhkfXyobd26A 提取码:drfs (2 ...

  6. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

  7. java 得到目录路径的方法

    得到web项目的根目录路径 System.getProperty("user.dir")// String path = this.getServletContext().getR ...

  8. poj3107树的重心

    /*树的重心求法:两次dfs,第一次dfs处理出每个结点的size,以此求每个结点大儿子的size,第二次dfs将每个结点大儿子的size和余下结点数进行比较,所有结点里两个值之间差值最小的那个点就是 ...

  9. html5 drag 文件拖拽浅淡

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Dinner

    问题 : Dinner 时间限制: 1 Sec  内存限制: 32 MB 题目描述 Little A is one member of ACM team. He had just won the go ...