链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1317
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29015#problem/F

XYZZY

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1701    Accepted Submission(s): 419

Problem Description
It has recently been discovered how to run open-source software on the Y-Crate gaming device. A number of enterprising designers have developed Advent-style games for deployment on the Y-Crate. Your job is to test a number of these designs to see which are winnable. 
Each game consists of a set of up to 100 rooms. One of the rooms is the start and one of the rooms is the finish. Each room has an energy value between -100 and +100. One-way doorways interconnect pairs of rooms.

The player begins in the start room with 100 energy points. She may pass through any doorway that connects the room she is in to another room, thus entering the other room. The energy value of this room is added to the player's energy. This process continues until she wins by entering the finish room or dies by running out of energy (or quits in frustration). During her adventure the player may enter the same room several times, receiving its energy each time.

Input
The input consists of several test cases. Each test case begins with n, the number of rooms. The rooms are numbered from 1 (the start room) to n (the finish room). Input for the n rooms follows. The input for each room consists of one or more lines containing:

the energy value for room i 
the number of doorways leaving room i 
a list of the rooms that are reachable by the doorways leaving room i 
The start and finish rooms will always have enery level 0. A line containing -1 follows the last test case.

Output
In one line for each case, output "winnable" if it is possible for the player to win, otherwise output "hopeless". 
Sample Input
5 0 1 2 -60 1 3 -60 1 4 20 1 5 0 0 5 0 1 2 20 1 3 -60 1 4 -60 1 5 0 0 5 0 1 2 21 1 3 -60 1 4 -60 1 5 0 0 5 0 1 2 20 2 1 3 -60 1 4 -60 1 5 0 0 -1
Sample Output
hopeless hopeless winnable winnable
Source
University of Waterloo Local Contest 2003.09.27
Recommend
Eddy

题意:


    有 N 个房间, 编号从 1 到 N 。
    每次进入一个房间, 能量值可能增加也可能减少
    问:从第一个房间开始走, 给你 100 个能量值。
        问你是否能走到第 N 个房间。

第一行 N  输入房间的个数
    然后下面 N 行数据:
        第 i  行数据的第一个表示进入该房间得到的能量【可正可负】
        第二个表示从该房间出发能到达的房间个数 num
        剩下 num 个数表示可以到达的房间编号

算法:Bellman_ford() 判断正环

注意:有向图,
      然后建图的时候要注意下, 边是没有权的。。。
      点有权

思路:

其实开始没看题目的时候,没有看到群里的吐槽也不会想到用 Bellman_ford()
      如果图中存在正环, 那么就可以不停的走这个环来增加能量,
      如果环中的点能到达 N 那么肯定是赢了。。。
      但是由于这个先入为主的思想,开始很容易的就让我忽略了,这题的本质是到达 N 的时候还有能量。
      然后就是各种不注意,各种 WA 的血泪史。。。。然后网上各种高深的题解。

      直到看到了一篇用 Bellman_ford 写的

加边建图的过程同时记录连通性, 先判断 1 与 N 在不考虑能量的时候是否连通【不判断也可以,只是个无关紧要的优化】

      然后就是套用 Bellman_ford() 判断是否有正环

注意:当不存在正环的时候, 不要像以前用这个算法时直接跳出
            因为我们的主要目的不是判断正环,而是要使得到达 N 还有能量。

那么赢的可能性就两种了:
      1.没有正环, 但是通过Bellman_ford() 的松弛操作, 到 N 的能量值 > 0
      2.存在正环, 正环中的点, 能到达终点。

code:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;const int maxn = 110;
const int INF = 10000000000;int w[maxn][maxn]; // 判断图的连通性
int en[maxn]; //进入该点的能量值
int d[maxn];  //每一点的能量值
int n,m; //n 个点, m 条边struct Edge{int u,v;
}edge[maxn*maxn];void floyd() // 有向图的传递闭包
{for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)w[i][j] = w[i][j] || (w[i][k] && w[k][j]);  //不要写错了 WA 的都是泪。。。
}bool Bellman_ford()
{for(int i = 1; i <= n; i++) d[i] = -INF;d[1] = 100; // 初始第一个点有 100 个能量for(int i = 1; i < n; i++){for(int j = 0; j < m; j++){int u = edge[j].u;int v = edge[j].v;if(d[v] < d[u]+en[v] && d[u]+en[v] > 0) //松弛d[v] = d[u]+en[v]; //是加上点的权。。。} //注意:不能像以前一样不能松弛了,就直接返回 false 因为判断正环的目的是使 d[n] > 0}for(int i = 0; i < m; i++){int u = edge[i].u;int v = edge[i].v;if(d[v] < d[u]+en[v] && d[u]+en[v] > 0) //如果存在正环if(w[v][n]) //正环中的点能够到达终点return true;}return d[n]>0; // 不存在正环, 判断能否依靠 100 个能量值到达终点
}int main()
{while(scanf("%d", &n) != EOF){if(n == -1) break;m = 0; // 初始化边memset(w, 0, sizeof(w));memset(en, 0, sizeof(en));for(int i = 1; i <= n; i++) w[i][i] = 1;int num;for(int i = 1; i <= n; i++){int v;scanf("%d%d", &en[i], &num);while(num--) //注意是单向的{scanf("%d", &v);edge[m].u = i;edge[m++].v = v;w[i][v] = 1; // 有向图, 不要傻逼的加上 w[v][i] = 1}}floyd(); // 考查有向图的连通性/*if(!w[1][n]){printf("hopeless\n"); continue;}*/if(Bellman_ford()) printf("winnable\n");else printf("hopeless\n");}return 0;
}

转载于:https://www.cnblogs.com/pangblog/p/3255870.html

hdu 1317 XYZZY【Bellheman_ford 判断正环小应用】相关推荐

  1. HDU 1317 XYZZY(floyd+bellman_ford判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 题意: 给出一个有向图,每到达一个点,都会加上或减去一些能量,我们要做的就是判断从1出发是否能到达n.初始 ...

  2. 货币兑换(判断正环)

    货币兑换 POJ - 1860 我们城市有几个货币兑换点.让我们假设每个点专门研究两种特定的货币,并且只与这些货币进行兑换操作.可以有多个点专门用于同一对货币.每个点都有自己的汇率,A到B的汇率就是1 ...

  3. Arbitrage(判断正环 spfa写法)

    题目如下: Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a cu ...

  4. HDU 1317 XYZZY

    大意:起始点100HP,给定n个房间,进入房间内加上或者减去 wHP,同一房间可以进入多次,问能否到达终点(HP大于0).起点0,终点n-1. 思路: 假设图中没有环,如果要到达终点,则需让剩下的HP ...

  5. Arbitrage——判断正环Bellman-Ford/SPFA

    [题目描述] Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a c ...

  6. hdu 1317——XYZZY

    http://blog.csdn.net/dongshimou/article/details/35984917

  7. poj 2240 Arbitrage(bellman-ford spfa 判断正环)

    http://poj.org/problem?id=2240 基本和poj 1860相同 只是把单点变成了任意点 做完1860再做这题就完全把思路套上就过了 做完才发现网上的题解都用的是floyd 不 ...

  8. POJ 2240 Arbitrage(SPFA判正环)

    POJ 2240 Arbitrage 题目大意 套利是指利用货币汇率的差异,将一种货币的一个单位转换为同一货币的多个单位.例如,假设1美元买0.5英镑,1英镑买10.0法国法郎,1法国法郎买0.21美 ...

  9. I - Arbitrage(判断是否有无正环 II)

    题目描述 Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a cur ...

最新文章

  1. Linux中的chmod权限问题
  2. python安装psutil库及使用
  3. Hard Disk Drive HDU - 4788——24行代码AC,解题报告
  4. flink报错org.apache.commons.cli.Option.builder
  5. elasticSearch 安装和 head插件使用
  6. 看完这篇文章保你面试稳操胜券——React篇
  7. vue命令行错误处理
  8. spring security:自定义认证成功处理器
  9. vfp程序改错 计算机和英语,vfp程序改错教案.doc
  10. rsa算法python_GitHub 热门:Python 算法大全,Star 超过 2 万
  11. C库中没有itoa以及C++中string没有split方法的原因
  12. android 系统 (103)---系统memory使用状况
  13. c++ 异常处理(3)
  14. Spark sample入门到精通
  15. iweboffice之word——功能简介
  16. linux 3.16内核下载,linux块设备驱动程序示例(适用于高版本内核3.16.0 - 3.19.0等,亲测可用)...
  17. 【干货】啦啦啦~再也不用担心webStorm激活码失效了
  18. [含lw+源码等]S2SH+mysql的报刊订阅系统[包运行成功]Java毕业设计计算机毕设
  19. 用Wireshark+小度WIFI抓手机app包
  20. goinception审核规则

热门文章

  1. kafka彻底删除topic(cleanup policy)、清除特定topic数据
  2. flink的scala版本的wordcount+flink没有输出结果的几种原因
  3. MongoDB 和 Python 不通用的操作
  4. django-oscar的默认地点打开后总是united kingdom
  5. ValueError: Related model 'users.UserProfile' cannot be resolved
  6. synaptic不停抖动后自动关闭的问题
  7. maven构建scala工程并最终运行的所有细节(scala maven helloworld)
  8. mysql-workbench中用select in对变量赋值
  9. 基于基站定位数据的商圈分析代码详细解释
  10. 关于Integer大小比较的问题