题目链接: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)(题目起这么长感觉有点慌--)的更多相关文章

  1. hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  2. spfa+差分约束系统(D - POJ - 1201 && E - POJ - 1364&&G - POJ - 1)+建边的注意事项+超级源点的建立

    题目链接:https://cn.vjudge.net/contest/276233#problem/D 具体大意: 给出n个闭合的整数区间[ai,bi]和n个整数c1,-,cn. 编写一个程序: 从标 ...

  3. bzoj2330: [SCOI2011]糖果 差分约束系统

    幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候 ...

  4. 牛客网NOIP赛前集训营 第6场 T1 最长路

    [题解] 先建反向图,然后跑拓扑排序求出最长路. 将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字.起点的排名为第二关键字排序. 按照这个顺序更新这一层的答案,按照这一层每 ...

  5. 洛谷 P1807 最长路_NOI导刊2010提高(07)题解

    相当与一个拓扑排序的模板题吧 蒟蒻的辛酸史 题目大意:给你一个有向无环图,让你求出1到n的最长路,如果没有路径,就输出-1 思路:一开始以为是一个很裸的拓扑排序 就不看题目,直接打了一遍拓扑排序 然后 ...

  6. POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)

    (点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...

  7. ZOJ 3795 Grouping(scc+最长路)

    Grouping Time Limit: 2 Seconds      Memory Limit: 65536 KB Suppose there are N people in ZJU, whose ...

  8. 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...

  9. HDU.1529.Cashier Employment(差分约束 最长路SPFA)

    题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若 ...

随机推荐

  1. 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...

  2. Luogu 5108 仰望半月的夜空(后缀数组)

    如果是要求左端点最大,直接求出SA,找前缀名次最小值就可以了.虽然现在要左端点最小,但我们已经知道了这个字典序最小的串是什么,找到名次数组上的合法区间求最小值即可.我也不知道为什么我会弃掉这个题,可能 ...

  3. XOR and Favorite Number CodeForces - 617E(前缀异或+莫队)

    题意原文地址:https://blog.csdn.net/chenzhenyu123456/article/details/50574169 题意:有n个数和m次查询,每次查询区间[l, r]问满足a ...

  4. A Chess Game HDU - 1524 (有向图博弈)

    题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步 ,如果到某一步玩家不能移动时,那么这个人就输. 分析:本题是最典型的有向无环图的博弈, ...

  5. MT【158】只在此山中,云深不知处

    求证:方程$3ax^2+2bx-(a+b)=0(b\ne0)$在$(0,1)$内至少有一个实数根. 提示:$f(0)=-(a+b),f(\dfrac{2}{3})=\dfrac{1}{3}(a+b)$ ...

  6. MT【118】利用线面角最小解题

    解:如图将正四面体放到立方体中,让AB通过$\alpha$面,让$\alpha$面绕着AB动起来.问题就转化成为EF与面$\alpha$线面角$\theta$了.EF的投影为$|EF|cos\thet ...

  7. Android指纹识别API讲解,让你有更好的用户体验

    我发现了一个比较怪的现象.在iPhone上使用十分普遍的指纹认证功能,在Android手机上却鲜有APP使用,我简单观察了一下,发现Android手机上基本上只有支付宝.微信和极少APP支持指纹认证功 ...

  8. python之插入排序

    插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部 ...

  9. BZOJ3835 [Poi2014]Supercomputer 【斜率优化】

    题目链接 BZOJ3835 题解 对于\(k\),设\(s[i]\)为深度大于\(i\)的点数 \[ans = max\{i + \lceil \frac{s[i]}{k}\} \rceil\] 最优 ...

  10. Linux内核设计第八周学习总结 理解进程调度时机跟踪分析进程调度与进程切换的过程

    陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.视频内容 Linux ...