POJ-1932 XYZZY(判正权环路+Warlshell传递闭包)
来源:互联网 发布:四声母域名 club 编辑:程序博客网 时间:2024/06/05 09:22
题意:
给定有向图,初始时在1号节点中,拥有的能量是100,每个节点都有一个能量增量(可负),每次进入一个节点中,你拥有的能量就加上当前节点的增量,如果在进入某一节点时能量变成<= 0,则死亡。问最终能否到达n号节点。
思路:
乍一看很简单,不就是求一个正权回路嘛,但是还是有几个坑点的。首先直接SPFA求最长路,看我们能否直接到达n号节点,并且在求的过程中求出所有1号节点能够到达的正权环路。如果能直接安全到达则YES,否则我们还需要通过传递闭包,看是否存在从1号节点出发且能到达n号节点的正权环路上的点,如果有则YES,否则NO。
代码:
#include <algorithm>#include <iostream>#include <string.h>#include <vector>#include <queue>using namespace std;const int maxn = 105;const int inf = 0x3f3f3f3f;int n, m, x;bool mp[maxn][maxn];int energy[maxn];int dis[maxn], cnt[maxn];bool vis[maxn];vector<int> g[maxn];queue<int> q;void Warlshell(){ for(int i = 1; i <= n; ++i) { for(int j = 1; j <= n; ++j) { if(!mp[i][j]) { for(int k = 1; k <= n; ++k) { if(mp[i][k] && mp[k][j]) { mp[i][j] = 1; break; } } } } }}bool SPFA(){ while(!q.empty()) q.pop(); memset(vis, 0, sizeof vis); memset(cnt, 0, sizeof cnt); fill(dis, dis+n+1, -inf); vis[1] = 1, dis[1] = 100; q.push(1); while(!q.empty()) { int u = q.front(); q.pop(); if(++cnt[u] > n+1) continue; vis[u] = 0; for(int i = 0; i < g[u].size(); ++i) { int v = g[u][i]; if(dis[v] < dis[u] + energy[v]) { dis[v] = dis[u] + energy[v]; if(!vis[v] && dis[v] > 0) vis[v] = 1, q.push(v); } } } if(dis[n] > 0) return 1; Warlshell(); for(int i = 1; i <= n; ++i) if(mp[1][i] && mp[i][n] && cnt[i] > n) return 1; return 0;}int main(){ ios::sync_with_stdio(0); while(cin >> n && n+1) { memset(mp, 0, sizeof mp); for(int i = 1; i <= n; ++i) g[i].clear(); for(int i = 1; i <= n; ++i) { cin >> energy[i]; cin >> m; for(int j = 1; j <= m; ++j) { cin >> x; g[i].push_back(x); mp[i][x] = 1; } } if(SPFA()) cout << "winnable" << endl; else cout << "hopeless" << endl; } return 0;}
继续加油~
阅读全文
1 0
- POJ-1932 XYZZY(判正权环路+Warlshell传递闭包)
- POJ 1932 XYZZY(Floyd传递闭包+BellmanFord判环)
- XYZZY(hdu1317,传递闭包+Dijstra)
- 【HDU】1317 XYZZY spfa判负环+floyd求传递闭包
- POJ 1932 XYZZY
- poj 1932 XYZZY
- POJ 1932 XYZZY 判正环
- POJ 1932 XYZZY 笔记
- HDU 1317 POJ 1932 XYZZY
- HDU 1317 POJ 1932 XYZZY
- poj 1932 XYZZY(SPFA)
- hdoj 1317 XYZZY 【spfa判断正环求最长路径&&floyd求传递闭包】
- HDU 1317--XYZZY 【spfa判断正环求最长路径 && floyd求传递闭包】
- poj 3660 传递闭包
- POJ 1975 传递闭包
- poj 3275(传递闭包)
- POJ 1932 XYZZY (ZOJ 1935)SPFA+floyd
- poj 3660(Floyd传递闭包)
- android Scroller
- sql依赖注入的解决方案
- 图像布局算法
- vue学习04--[转发]Vuejs中computed、methods、watch的区别
- JS-Jquery 常用功能
- POJ-1932 XYZZY(判正权环路+Warlshell传递闭包)
- 《集体智慧编程》第九章
- 表单标签
- 抽象类和接口的区别
- 文件上传
- 刷题#R5
- (4.1.39)Android屏幕测量:屏幕、状态栏、标题栏
- ios开发之人脸识别(给眼睛打上马赛克)
- nova调用rados来实现snapshot