题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1317

题目大意:

题意:有n个房间(n<=100),每个房间有一个点权(第1号房间和第n号房间权值均为0),到达该房间时会自动获得该点权(可能为负权)。给出一些无向边。有一个人,初始有能量值100,初始位置是第1号房间,要走到第n号房间,且路途中不得使身上能量值小于或等于0。能到达第n个房间就算赢,问能否赢。

解题思路:

这里最坑的是第一号房间可能和最后一个房间连通不了。所以首先得判断连通性,再Bellman求最短路。

如果floyd判断房间1和房间n不连通,直接输出失败

如果在第n次还在松弛并且松弛的点可以到达终点n,说明存在正环且该正环能到达n,此时一定是成功的。

如果到达n的时候能量值为正数则成功,为0或者负数则失败

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
struct edge
{
int u, v, w;
edge(){}
edge(int u, int v, int w):u(u), v(v), w(w){}
};
edge e[maxn];
bool Map[][];
int num[], n, d[maxn], tot;
void addedge(int u, int v, int w)
{
e[tot++] = edge(u, v, w);
}
void floyd()//判断连通性
{
for(int k = ; k <=n; k++)
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
Map[i][j] |= (Map[i][k]&Map[k][j]);
}
}
}
}
bool Bellman(int u)
{
memset(d, -INF, sizeof(d));
d[u] = ;
for(int i = ; i < n; i++)
{
for(int j = ; j < tot; j++)
{
int u = e[j].u, v = e[j].v, w = e[j].w;
if(d[u] + w > d[v] && d[u] > )//d[u]>0说明只有能量为正的点才可以对其相邻的边进行松弛
{
d[v] = d[u] + w;
if(i == n - && Map[v][n])
//i==n-1说明第n次迭代还在松弛,说明存在正环
//Map[v][n]=1说明松弛的点可以到达终点(这里改成Map[u][n]也是一样的,因为这两个的值是一样的,因为存在边<u, v>)
//满足上面两个条件说明存在一个正环,且该环可以到达终点
//可以一直在正环中运动使得能量值无穷大,最后就一定能到终点
return ;
}
}
}
return d[n] > ;
}
int main()
{
while(cin >> n && n != -)
{
int t, x;
tot = ;
memset(Map, , sizeof(Map));
for(int i = ; i <= n; i++)
{
cin >> num[i];
cin >> t;
while(t--)
{
cin >> x;
Map[i][x] = ;
}
}
for(int u = ; u <= n; u++)
{
for(int v = ; v <= n; v++)
{
if(Map[u][v])addedge(u, v, num[v]);
}
}
floyd();
if(!Map[][n])cout<<"hopeless"<<endl;//1-n直接不连通
else if(Bellman())cout<<"winnable"<<endl;
else cout<<"hopeless"<<endl;
}
return ;
}

hdu-1317 XYZZY---Floyd判连通+bellman最短路的更多相关文章

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

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

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

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

  3. hdu 1317 XYZZY

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

  4. HDU 1317 XYZZY【Bellman_Ford判断正环】

    题意:给出n个房间,初始在房间1有100的能量值,每次进入一个房间,能量值可能增加也可能减小,(是点权,不是边权),问能否到达终点的时候能量值还为正 这题自己写的时候wa--wa-- 后来看了题解,还 ...

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

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

  6. UVa11549计算器谜题[floyd判圈]

    题意: 有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 白书上的题 set, ...

  7. SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...

  8. UVa 1594 (Floyd判圈) Ducci Sequence

    大白书上P42那个计算器的题目就用到了这个办法,Floyd判圈法. 当然,用STL里的map也是可以的. #include <cstdio> #include <cmath> ...

  9. UVA 11549 CALCULATOR CONUNDRUM(Floyd判圈算法)

    CALCULATOR CONUNDRUM   Alice got a hold of an old calculator that can display n digits. She was bore ...

随机推荐

  1. 消耗战——dp+虚树

    题目 [题目描述] 在一场战争中,战场由 $n$ 个岛屿和 $n-1$ 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为 $1$ 的岛屿,而且他们已经没有足够多 ...

  2. ajax跨域问题解决方案(jsonp,cors)

    跨域 跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致 2:协议不一致 3:域名不一致 解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用 ...

  3. springIOC源码解析之BeanDefinition的注册

    ApplicationContext类结构 context是一个存储上下文结构的东西,里面会引用BeanFactory  BeanFactory类结构 我们从这句代码开始分析,(本文spring采用的 ...

  4. Topoi 测验1301, 问题C: 1959: 解题 解题报告

    Topoi(一个经常会炸的网站) 本题提交链接 很久以前的题目了, 刚开了博客,来写一波题解 先看一波提交记录: 调了好几天QAQ 唉! 要是这些高手里有我估计直接 输出1 就AC了 算法 DFS + ...

  5. 对sass通过compass进行编译

    1.创建一个Compass项目:compass create myproject 其中myproject是项目名称.2.编写scss文件.3.编译成css文件:①:Compass的编译命令是:comp ...

  6. 浅谈ThreadLocal模式

    一.前言: ThreadLocal模式,严格意义上不是一种设计模式,而是java中解决多线程数据共享问题的一个方案.ThreadLocal类是java JDK中提供的一个类,用来解决线程安全问题,并不 ...

  7. HDU 2473 Junk-Mail Filter 并查集,虚拟删除操作

    http://acm.hdu.edu.cn/showproblem.php?pid=2473 给定两种操作 第一种是合并X Y 第二种是把X分离出来,就是从原来的集合中分离出来,其它的关系不变. 关键 ...

  8. malloc内存申请--释放-收缩

     一.验证思路和代码 #include <stdio.h> #include <unistd.h> #include <malloc.h> #include < ...

  9. 深刻理解Linux进程间通信(IPC)

    https://www.ibm.com/developerworks/cn/linux/l-ipc/ linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管 ...

  10. Oracle的表操作,约束

    回顾MySQL创建表语句users(id整型/name字符串/birthday日期型,默认今天)drop table if exists users;create table if not exist ...