题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1317

题目大意:有n个房间,编号1~n,房间之间有单向门连接。某人初始位于1号房间,且具有100点能量。此人要去n号房间,中途每经到一个房间Ri,其能量值会加上一个值ai,当其能量值小于等于0的时候会死掉。问此人能否到达n号房间。n<100, -100 <= ai <= 100。

分析:将房间看做结点,单向门看成单向边,形成一张有向图,问题转换为搜索一条从1号点能到达n号点的路径。

  使用SPFA算法搜索最长路。如果图中不存在环,则找一条最长路即可。

  否则,存在负环不影响结果。

  如果存在正环,在顶点第n次进队列的时候,距离标记成无穷大,之后不在进队。这样,只要存在合理的路径,就一定能到达n点,不能到达说明无解。

参考代码:

 #include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define N 110
#define inf 1000000000 vector<int>ve[N]; int w[N];
int Q[N*N];
bool inq[N];
int dis[N], cnt[N];
int id;
bool spfa(int n)
{
for(int i = ; i <= n; i++)
{
dis[i] = -inf, inq[i] = , cnt[i] = ;
}
dis[] = ;
int top = ;
Q[top++] = ;
inq[] = cnt[] = ;
for(int i = ; i < top; i++)
{
int u = Q[i];
inq[u] = ;
if(dis[u]+w[u] <= ) continue;
int m = ve[u].size();
for(int j = ; j < m; j++)
{
int v = ve[u][j];
if(dis[v] < dis[u] + w[u])
{
dis[v] = dis[u] + w[u];
if(v == n) return true;
if(!inq[v])
{
cnt[v]++;
if(cnt[v] > n) continue;
if (cnt[v] == n)
dis[v] = inf;
Q[top++] = v;
inq[v] = ;
}
}
}
}
return false;
}
int main()
{
int n;
while(~scanf("%d", &n), ~n)
{
for(int i = ; i <= n; i++) ve[i].clear();
for(int i = ; i <= n; i++)
{
int m, t;
scanf("%d", &w[i]);
scanf("%d", &m);
for(int j = ; j < m; j++)
{
scanf("%d", &t);
ve[i].push_back(t);
}
}
bool res = spfa(n);
if(res) puts("winnable");
else puts("hopeless");
}
return ;
}

HDU 1373 XYZZY (spfa的特殊用法)的更多相关文章

  1. [HDU 1317]XYZZY[SPFA变形][最长路]

    题意: 一个图, 点权代表走到该点可获得的能量值. 可正可负. 一个人从1 号出发,带有100点能量. 问是否有一种方案可使人在能量值>0的时候走到n. 思路: 这个题首先要注意点权. 其实就是 ...

  2. XYZZY(spfa求最长路)

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 XYZZY Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  3. hdu 4568 Hunter(spfa预处理 + 状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...

  4. hdu 1317 XYZZY【Bellheman_ford 判断正环小应用】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1317 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  5. hdu 1317 XYZZY

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 #include <cstdio> #include <queue> #inclu ...

  6. hdu 1217 Arbitrage (spfa算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:通过货币的转换,来判断是否获利,如果获利则输出Yes,否则输出No. 这里介绍一个ST ...

  7. HDU 2112 HDU Today &lt;SPFA算法+map函数&gt;

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. HDU 4433 locker(SPFA+DP)

    题目链接 去年区域赛的题目,早就看过题目了,又是过了好久了... 这题状态转移,一看就知道应该是 线性的那种,不过细节真的不好处理,一直没想出怎么搞,期间也看过题解,好像没太看懂... dp[i][j ...

  9. HDU 4268 Alice and Bob set用法

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4268 贪心思想,用set实现平衡树,但是set有唯一性,所以要用 multiset AC代码: #i ...

随机推荐

  1. 数据库-SqlServer 行转列,列转行

    两篇行转列,列转行的实例文章: 第1篇:https://www.cnblogs.com/cpcpc/archive/2013/04/08/3009021.html 第2篇:https://mp.wei ...

  2. layer系列之弹层layer.prompt

    layer官网:https://www.layui.com/doc/modules/layer.html layer在线调试:http://layer.layui.com/ 如何使用layer.pro ...

  3. 剑指 Offer——最小的 K 个数

    1. 题目 2. 解答 2.1. 方法一--大顶堆 参考 堆和堆排序 以及 堆的应用,我们将数组的前 K 个位置当作一个大顶堆. 首先建堆,也即对堆中 [0, (K-2)/2] 的节点从上往下进行堆化 ...

  4. js 创建对象的方法

    <script> //1.字面量语法 var rectangle1 = {}; rectangle1.name="mindong"; rectangle1.width ...

  5. layui中获取全部提交的数据

    <form class="layui-form" action="">...........input textarea ......</fo ...

  6. python3爬虫之urllib初探

    urllib主要包含request(请求模块).error(异常处理模块).parse(工具模块).robotparser(识别网站的robots.txt文件,是否允许爬取). request(请求模 ...

  7. json-server-----》基本使用

    [WangQi]---json-server---基本使用   一.前后端并行开发的痛点 前端需要等待后端开发完接口以后 再根据接口来完成前端的业务逻辑 二.解决方法 在本地模拟后端接口用来测试前端效 ...

  8. [Web 前端] 017 css 浮动

    1. 文档流 指盒子按照 html 标签编写的顺序依次从上到下,从左到右排列 块元素占一行 行内元素在一行之内 从左到右排列 先写的先排列 后写的排在后面 每个盒子都占据自己的位置 2. 浮动的特性 ...

  9. <每日一题> Day3:CodeForces-1141B.MaximalContinuousRest(简单题)

    题目链接 参考代码: #include <iostream> #include <algorithm> using namespace std; + ; int value[m ...

  10. 在学习linux磁盘管理期间学习的逻辑卷管理笔记

    LVM(逻辑分区)的创建顺序:物理分区-物理卷-卷组-逻辑卷-挂载. 物理卷(Physical Volume,PV):就是指硬盘分区,也可以是整个硬盘或已创建的软RAID,是LVM的基本存储设备. 卷 ...