题目链接: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. 在ubuntu12.4上安装minigui3.0.12

      在ubuntu12.4上安装minigui3.0.12 一下载源文件 移植所需的文件可以从minigui官网下载:http://www.minigui.org/en/download/ 主要文件有 ...

  2. Java实体类之间的映射(一对多关系)

    通过栗子,一个人可以有多辆汽车 定义人   这个类 人可以有很多辆汽车,类中车属性用数组 class Person{ private String name; private String phone ...

  3. selinux 了解2

    凡是对内核级, 如selinux的修改, 不只是对软件, 程序的修改, 那么修改之后都要重新启动. 针对windows下的截图, 像linux下的screenshot截图那样设置快捷键 shift+s ...

  4. JS text节点无innerHTML

    在线预览 text节点无innerHTML这个属性!!! 如果直接修改text节点的属性(data,nodeValue,textContent),或者使用js原生的修改text节点的内容的方法都会将H ...

  5. QCOW2/RAW/qemu-img 概念浅析

    目录 目录 扩展阅读 RAW QCOW2 QEMU-COW 2 QCOW2 Header QCOW2 的 COW 特性 QCOW2 的快照 qemu-img 的基本使用 RAW 与 QCOW2 的区别 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_6_LinkedHashSet集合

    把www挪到最上面,第一个加入到哈希

  7. Samba 1.0服务部署

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统.打印机及其他资源. ...

  8. C# Thread3——前台线程后台线程

    默认情况下,显示创建的线程都是前台线程,进程会等待内部所有的前台线程执行完才会结束退出 1.默认创建的线程都是前台线程 2.进程会等待所有的前台线程执行完而结束,如果还存在后台线程则会强行中断并且退出 ...

  9. oracle--角色权限

    将不同权限赋予角色,再将角色赋予用户,起到管理权限的作用 SQL> create role myrole; 角色已创建. SQL> grant create session to myro ...

  10. VSL基础

    VSL是Virtools提供的一个非常有创意的脚本语言,它以输写代码的方式(区别于Virtools现有的图形化编程界面)进行编程开发,提高了程序的可读性和工作效率. 下图的功能是:将一个3D物体拷贝出 ...