spfa+floyed+最长路+差分约束系统(F - XYZZY POJ - 1932)(题目起这么长感觉有点慌--)
题目链接:https://cn.vjudge.net/contest/276233#problem/F
题目大意:给你n个房子能到达的地方,然后每进入一个房子,会消耗一定的生命值(有可能是负),问你一开始在第一个方间,初始生命值是100,最终能不能从第n个房间走出?
具体思路:首先,我们需要建图,按照正常的建立就可以了,然后再去跑一个spfa,注意这个spfa求的是最长路,然后判断一下,在没有正环的时候,看一下最终到达的n是不是正的,如果是正的,那么肯定行,否则的话,再去判断有没有正环,如果有正环,并且能够到达n点,这也是符合的情况。然后对于正环的判断,如果有正环,我们无法判断是否能到达第n个点,这个时候就需要用到floyed了,我们通过floyed判断第一个点能不能到达最后一个点,然后再判断一下中转点是不是一个正环上的点,这样的话,我们可以先通过正环加上无限的生命值,然后出去就可以了,这样又不会死。。。
一点小感悟,如果是判断正环还是负环,我们都可以通过spfa进行判断,判断条件就是判断这个点入队列的次数和总的点数,如果一个点入队列的次数大于总的点数,那么就可以判断是正环还是负环了,但是一个spfa只能判断一种,因为用spfa判断的时候,最长路和最短路的松弛条件是不一样的,所以需要判断的话得分开判断。
AC代码:
- #include<bit/stdc++.h>
- using namespace std;
- # define ll long long
- # define inf 0x3f3f3f3f
- const int maxn = +;
- int Map[maxn][maxn];
- int head[maxn],vis[maxn],dis[maxn],out[maxn];
- struct node
- {
- int to;
- int cost;
- int nex;
- } edge[maxn*maxn];
- int n,num;
- void addedge(int fr,int to,int cost)
- {
- edge[num].to=to;
- edge[num].cost=cost;
- edge[num].nex=head[fr];
- head[fr]=num++;
- }
- void init()
- {
- memset(Map,,sizeof(Map));
- for(int i=; i<maxn; i++)
- {
- Map[i][i]=;
- out[i]=;
- head[i]=-;
- vis[i]=;
- dis[i]=-inf;
- }
- num=;
- }
- int spfa(int st)
- {
- dis[st]=;
- vis[st]=;
- queue<int>q;
- q.push();
- while(!q.empty())
- {
- int tmp=q.front();
- q.pop();
- if(++out[tmp]>n)
- break;
- vis[tmp]=;
- for(int i=head[tmp]; i!=-; i=edge[i].nex)
- {
- int u=edge[i].to;
- if(dis[u]<dis[tmp]+edge[i].cost&&dis[tmp]+edge[i].cost>)
- {
- dis[u]=dis[tmp]+edge[i].cost;
- if(vis[u])
- continue;
- vis[u]=;
- q.push(u);
- }
- }
- }
- if(dis[n]>)
- return ;
- for(int i=; i<=n; i++) {
- for(int j=; j<=n; j++) {
- for(int k=; k<=n; k++) {
- if(Map[j][i]&&Map[i][k]){
- Map[j][k]=;
- }
- }
- }
- }
- for(int i=; i<=n; i++) {
- if(Map[][i]&&Map[i][n]&&out[i]>n)
- return ;
- }
- return ;
- }
- int main()
- {
- while(~scanf("%d",&n)){
- if(n==-)break;
- init();
- int t,ed;
- for(int i=; i<=n; i++)
- {
- int cost,ti;
- scanf("%d %d",&cost,&ti);
- while(ti--)
- {
- scanf("%d",&ed);
- addedge(i,ed,cost);
- Map[i][ed]=;
- }
- }
- int ans=spfa();
- if(ans==)
- printf("hopeless\n");
- else
- printf("winnable\n");
- }
- return ;
- }
spfa+floyed+最长路+差分约束系统(F - XYZZY POJ - 1932)(题目起这么长感觉有点慌--)的更多相关文章
- hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- spfa+差分约束系统(D - POJ - 1201 && E - POJ - 1364&&G - POJ - 1)+建边的注意事项+超级源点的建立
题目链接:https://cn.vjudge.net/contest/276233#problem/D 具体大意: 给出n个闭合的整数区间[ai,bi]和n个整数c1,-,cn. 编写一个程序: 从标 ...
- bzoj2330: [SCOI2011]糖果 差分约束系统
幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候 ...
- 牛客网NOIP赛前集训营 第6场 T1 最长路
[题解] 先建反向图,然后跑拓扑排序求出最长路. 将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字.起点的排名为第二关键字排序. 按照这个顺序更新这一层的答案,按照这一层每 ...
- 洛谷 P1807 最长路_NOI导刊2010提高(07)题解
相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后 ...
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- ZOJ 3795 Grouping(scc+最长路)
Grouping Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose there are N people in ZJU, whose ...
- 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa
原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...
- HDU.1529.Cashier Employment(差分约束 最长路SPFA)
题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若 ...
随机推荐
- Python面向对象高级编程:__slot__(给实例添加方法、属性)
纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...
- Python基础:Python函数、文件操作、递归
函数参数 函数参数包括位置参数,关键字参数,动态参数(*args, **args)三种. 传参的过程是形式参数的赋值. *args传入的参数是元组形式,**args传入的参数是字典形式. 示例代码如下 ...
- POJ1149_PIGS
一共有n个猪圈,m个客人,一开始每个猪圈都有一定数量的猪猪.每个客人会打开一些猪圈,带走最多为某一个数量的猪猪,剩下的猪猪可以任意分配在这些开了的猪圈里面,然后重新关上.问所有的客人最多可以带走多少猪 ...
- DAY2-Python学习笔记
1.迭代器:可以直接作用于for循环的对象统称为可迭代对象:Iterable,使用isinstance()判断一个对象是否是Iterable对象: >>> from collecti ...
- mapreduce方式操作hbase
一.导入数据到hbase 1.配置hbase-site.xml指向hdfs <configuration> <property> <name>hbase.rootd ...
- 查看临时表空间占用最多的用户与SQL
select sess.username, sql.sql_text, sort1.blocks from v$session sess, v$sqlarea sql, v$sort_usage ...
- [UOJ391] 鸽举选仕
我把这题推荐给yyb让他把这题做它的T2他竟然不要QwQ....... 题目大意: 下发八个题目和对应的八份代码,请构造数据Hack下发代码. Task1 下发代码用了一些神奇做法实现A + B = ...
- ELK5.4安装Xpack
X-Pack是一个Elastic Stack的扩展,将安全,警报,监控,报告和图形功能包含在一个易于安装的软件包中.在Elasticsearch 5.0.0之前,必须安装单独的Shield.Watch ...
- Compile、Make和Build的区别(as make, build, clean, run)
Compile.Make和Build的区别 - 熔 岩 - 51CTO技术博客 http://lavasoft.blog.51cto.com/62575/436216/ 针对Java的开发工具,一般都 ...
- D. Vitya and Strange Lesson Codeforces Round #430 (Div. 2)
http://codeforces.com/contest/842/problem/D 树 二进制(路径,每个节点代表一位) #include <cstdio> #include < ...