PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)
题目大意:原题链接
给你一张图,初始你在房间1,初始生命值为100,进入每个房间会加上那个房间的生命(可能为负),问是否能到达房间n。(要求进入每个房间后生命值都大于0)
解题思路:
解法一:Floyd+Bellman
1.Floyd先判断图是否连通,不连通则直接失败
2.Bellman Ford然后跑最长路,判断是否有正环或者有正通路
#include<cstdio>
#include<cstring>
using namespace std;
int n,val[],d[];
bool graph[][],link[][];
int main()
{
int i,j,k,cnt,id;
while(scanf("%d",&n),n!=-){
memset(d,-,sizeof(d));
memset(val,,sizeof(val));
memset(link,false,sizeof(link));
memset(graph,false,sizeof(graph));
for(i=;i<=n;i++){
scanf("%d%d",&val[i],&cnt);
while(cnt--){
scanf("%d",&id);
graph[i][id]=true;
link[i][id]=true;//用于判断任意两点间的连通性
}
}
//Floyd判断连通性
for(k=;k<=n;k++){
for(i=;i<=n;i++){
for(j=;j<=n;j++){
if(link[i][k]&&link[k][j])
link[i][j]=true;
}
}
}
if(!link[][n]){
printf("hopeless\n");
continue;
}//必须加上这个
link[n][n]=true;
//Bellman-ford求最长路径
d[]=;
for(k=;k<=n;k++){//遍历每一个节点
bool sign=true;
for(i=;i<=n;i++){//遍历每一条边
for(j=;j<=n;j++){//j,n必须是连通的,并且前一个点d[i]为正
if(graph[i][j]&&link[j][n]&&d[j]<d[i]+val[j]&&d[i]>){
d[j]=d[i]+val[j];
sign=false;
}
}
}//如果d[j]已经不能更新了,说明最长路已经查找完毕,即不存在正环,退出循环
if(sign) break;
}
if(k>n||d[n]>) printf("winnable\n");//有正环或者有正通路
else printf("hopeless\n");
}
}
解法二:Spfa+Floyd
1.Spfa先判正环+跑最长路,以及判断是否存在正通路
2.若d[n]<=0,则Floyd然后根据存在正环以及是否连通起点和终点判断是否会成功到达n点
#include<cstdio>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
int n,p,num[];//num[u]表示u入队次数
int val[],d[];
bool in[],link[][];
queue<int> que;
bool Spfa_floyd(int u)
{
for(int i=;i<=n;i++){
d[i]=-inf;
in[i]=,num[i]=;
}
while(!que.empty()) que.pop();//que定义为全局变量就得清空队列
que.push(u);
in[u]=true;
num[u]=,d[u]=;
while(!que.empty()){
u=que.front();
que.pop();
in[u]=false;
if(num[u]>n){
p=u;
break;//Spfa某节点入队次数大于n则有正环
}
for(int v=;v<=n;v++){
if(link[u][v]&&d[u]+val[v]>&&d[u]+val[v]>d[v]){
d[v]=d[u]+val[v];//最长路
if(!in[v]){
que.push(v);
in[v]=true;
num[v]++;
}
}
}
}
if(d[n]>) return true;
else{
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(link[i][k]&&link[k][j])
link[i][j]=true;
if(num[p]>n&&link[][p]&&link[p][n])
return true;//如果存在正环,并且连接起点和终点
return false;
}
} int main()
{
while(scanf("%d",&n),n!=-){
memset(link,,sizeof(link));
memset(val,,sizeof(val));
for(int i=;i<=n;i++){
int cnt,id;
scanf("%d%d",&val[i],&cnt);
for(int j=;j<=cnt;j++){
scanf("%d",&id);
link[i][id]=true;
}
}
if(Spfa_floyd()) puts("winnable");
else puts("hopeless");
}
}
PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)的更多相关文章
- POJ 1932 XYZZY (ZOJ 1935)SPFA+floyd
http://poj.org/problem?id=1932 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1935 题目大 ...
- poj 1932 XYZZY(spfa最长路+判断正环+floyd求传递闭包)
XYZZY Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4154 Accepted: 1185 Description ...
- 最短路问题(Bellman/Dijkstra/Floyd)
最短路问题(Bellman/Dijkstra/Floyd) 寒假了,继续学习停滞了许久的算法.接着从图论开始看起,之前觉得超级难的最短路问题,经过两天的苦读,终于算是有所收获.把自己的理解记录下来,可 ...
- HDU 2992 Hotel booking(BFS+DFS 或者 SPFA+Floyd)
点我看题目 题意 : 一个司机要从1点到达n点,1点到n点中有一些点有宾馆,司机的最长开车时间不能超过10小时,所以要在10小时之内找到宾馆休息,但是为了尽快的走到n点,问最少可以经过几个宾馆. 思路 ...
- 四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)
什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPF ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...
- poj 1932 XYZZY (最短路径)
XYZZY Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3105 Accepted: 887 Description ...
- 一个人的旅行(floyd+dijskra+SPFA+Bellman)
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...
随机推荐
- c# 扩展方法 奇思妙用 高级篇 九:OrderBy(string propertyName, bool desc)
下面是 Queryable 类 中最常用的两个排序的扩展方法: 1 2 public static IOrderedQueryable<TSource> OrderBy<TSourc ...
- c#后台读写Cookie
public class BaseCookies { #region Cookies public static void SetCookieValue(string key, string valu ...
- iOS开发之--使用storyboard进行跳转
iOS开发中使用故事板进行开发是非常高效的一种方式,虽然有这样那样的问题,但是不得不承认,使用sb可以在最短的时间内完成整个项目的布局,节约开发者大量的时间,而且便于修改,非常直观,虽然可能不太灵活, ...
- 170405、java版MD5工具类
package com.rick.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...
- Spring的Bean的生命周期以及Bean的后置处理器
Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进 ...
- jQuery UI dialog 参数说明
前段时间碰到个问题 jquery UI dialog弹出层 弹出多个层是 比如弹出两个层A和B B层如果显示的数据表格太大,伸到了A层的外面,那伸到A层之外的部分就看不到了,因为B层是在A层上弹出的 ...
- 巨蟒python全栈开发flask15项目开始7
1.连续收取未读消息&&未读消息所属人 2.Pypinyin NLP中文同音字识别 3.jieba分词 4.Gemsim框架之LsiModel稀疏矩阵相似度 5.Gensim的应用 6 ...
- bootloader,kernel,initrc
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html http://www.68idc.cn/help/server/li ...
- IIs7下配置php
因为一个朋友的服务器是window的需要两个版本的php,一个是现在用的php5.2,现在要用一个5.3的版本,所以考虑IIS下的配置. 1.首先当然是要下载一份php了,我采用的是免安装的,很方便, ...
- SmokePing安装手册
SmokePing安装部署 SmokePing简介 Smokeping是一款用于网络性能监测的开源监控软件,主要用于对IDC的网络状况,网络质量,稳定性等做检测,通过rrdtool制图方式,图形化地展 ...