POJ 1932 XYZZY (差分约束+传递闭包)
题目链接
题意
有NNN个屋子,走进每个屋子血量都会发生改变,开始生命值100100100。问是否可以从111号屋子走到NNN号屋子中间血量保持大于000
思路
- 按照给定的顺序建图,因为要让血量尽可能的高所以求最长路,如果走到NNN的最长路的血量小于0那么就无解。
- 最长路可能存在正环,当存在正环而且111到NNN联通,那么一定有解
- 个人认为标程应该是spfaspfaspfa判正环+传递闭包判联通,网上有人是判断存在正环之后把disdisdis赋值为infinfinf最后判断dis[n] > 0,这样其实不对,把disdisdis置为infinfinf不一定能更新到dis[n]>0dis[n] > 0dis[n]>0,可以测下这个数据。
5
0 1 2
1 1 3
2 1 4
3 2 2 5
-1061109567 0
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <numeric>
#include <algorithm>
#include <cstring>
#include <time.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 1e2 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
vector<int> g[maxn];
int dis[maxn], vis[maxn], cnt[maxn], val[maxn];
int mp[maxn][maxn];
int n;
int Spfa(int s, int e) {for (int i = 1; i <= e; ++i) {dis[i] = -inf;}mem(vis, 0);mem(cnt, 0);vis[s] = 1;cnt[s] = 1;dis[s] = 100;queue<int> que;que.push(s);while (!que.empty()) {int f = que.front();que.pop();vis[f] = 0;if (cnt[f] >= n) dis[f] = inf;int len = g[f].size();for (int i = 0; i < len; ++i) {int t = g[f][i];if (dis[t] < dis[f] + val[t] && dis[f] + val[t] > 0) {dis[t] = dis[f] + val[t];if (vis[t] == 0 && ++cnt[t] <= n) {vis[t] = 1;que.push(t);}if (cnt[t] > e) return -1;}}}return dis[e] > 0;
}
int main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);while (scanf("%d", &n) != EOF) {mem(mp, 0);if (n == -1) break;for (int i = 0; i <= n; ++i) g[i].clear();int num, d;for (int i = 1; i <= n; ++i) {scanf("%d%d", &val[i], &num);for (int j = 0; j < num; ++j) {scanf("%d", &d);g[i].push_back(d);mp[i][d] = 1;}}int ans = Spfa(1, n);if (ans == -1){for (int k = 1; k <= n; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (mp[i][k] && mp[k][j]) mp[i][j] = 1;}}}for (int i = 1; i <= n; ++i) {if (mp[1][i] && mp[i][n] && cnt[i] > n) {ans = 1;break;}}}if (ans == 1) puts("winnable");else puts("hopeless");}return 0;
}
POJ 1932 XYZZY (差分约束+传递闭包)相关推荐
- [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...
- POJ 3159 Candies 差分约束dij
分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ...
- poj 1201 Intervals 差分约束
真 .读题杀,英文题一脸懵逼,看来以后还要多读读英文题,不过读完了就能发现这其实是一道很裸的差分约束,按照题意建边即可,但还要注意的就是后一个要大于等于前一个,并且每个位置不能超过一个元素.求一边最大 ...
- O - Layout POJ - 3169(差分约束)
O - Layout POJ - 3169 参考 思路: 限制条件 : 最大距离不超过w d[v] - d[u] <= w; 最小距离超过w d[v] - d[u] >= w; 移项得 d ...
- POJ - 1201 Intervals(差分约束+最短路)
题目链接:点击查看 题目大意:给定n个闭区间[ai,bi]和n个整数ci,你需要构造一个整数集合Z,使得Z中满足所有的ai<=x<=bi的整数不少于ci个,求出这样的整数集合Z最少包含多少 ...
- POJ 3159[差分约束]
题目链接:[http://poj.org/problem?id=3159] 题意:有N个小朋友,编号为1-N,每个小朋友将分的一些糖果,给出一些关系A.B.C .表示B最多比A多C个,然后问你盆友1和 ...
- SUST 2019暑期集训题解(差分约束+生成树+传递闭包)
A 这个不等式组很眼熟吧 这道题的话上课讲过就是根据不等式建图然后跑一下最短路就可以了. #include<iostream> #include<cstring> #inclu ...
- POJ 1201 差分约束(集合最小元素个数)
题意: 给你一个集合,然后有如下输入,a ,b ,c表示在范围[a,b]里面有至少有c个元素,最后问你整个集合最少多少个元素. 思路: 和HDU1384一模一样,首先这个题目可 ...
- POJ 3159 Candies(差分约束+SPAF)
题意: 给n个小朋友分发糖果,但小朋友们之间有嫉妒心.接下来m行,每行三个数,分别表示小朋友A希望B得到的糖果不能比他多x个.要求你计算在满足所有小朋友的条件的情况下最多需要准备多少颗糖. 题目: D ...
最新文章
- 《小岛经济学--鱼、美元和经济的故事》Digest
- Google下的这盘“小”棋
- JavaScript实现depth First Search深度优先搜索算法(附完整源码)
- SpringBoot与jackson.databind兼容报错问题
- vue加百度统计代码(亲测有效)
- 怪物猎人服务器维护时间,怪物猎人云服务器
- Spring Boot下无法加载主类 org.apache.maven.wrapper.MavenWrapperMain问题解决
- 前端基础:技术栈简介
- WMS请求GetCapabilities,变成下载mapserv.exe解决办法
- 图片维度不匹配_内容审核基础:审核方式、流程与审核维度
- [转]Java 对象锁-synchronized()与线程的状态与生命周期
- edittext禁止换行符但能自动换行简书_利用 subfinder 让群辉 NAS 实现自动下载字幕...
- Spark机器学习之协同过滤算法
- WPF中使用Chart控件
- word自带公式编辑_原来有这样几种方式打开Word中的公式编辑器
- 全基因组重测序数据分析
- 杀戮空间2服务器修改地图,《杀戮空间2》新地图全任务完成方法图文详解
- element-ui+vue给登录界面创建一个走马灯幻灯片切换
- 什么原因可能会造成Android手机卡顿?
- 三层架构的bussiness层没用?