HDU - 1317 ~ SPFA正权回路的判断
题意:有最多一百个房间,房间之间连通,到达另一个房间会消耗能量值或者增加能量值,求是否能从一号房间到达n号房间。
看数据,有定5个房间,下面有5行,第 iii 行代表 iii 号 房间的信息,第一个数字表示从此房间到达连接的房间得到的能量,第二个数字表示连接的有几个房间,后面输出房间后。
思路: 正向去模拟,求出到达n点后尽可能的让dis[n]的值更大 , dis[1]初始化为100,其他初始化为零,因为在松弛的时候必须保证能量值大于零。
这里面说一下SPFA正权回路的判断,当一个点进入队列第n次的时候,说明存在正权回路(假设最坏的情况,其他n-1个点都会使这个点进入队列,若是进入n次,说明有回路)
为什么是最多进n-1次队列?
从1到n有n-1条边,对于一个顶点最多松弛n-1次!
注意: 本题需要注意dis数组初始化为0
看代码吧:
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
int cent[12010],u[12010],v[12010],w[12010],dis[12010],book[12010],first[12010],next1[12010];
int k,j=0,n,m,l,t1,t2,inf=-0x3f3f3f3f;
void SPFA()
{
memset(cent,0,sizeof(cent));//计算点进入队列的次数
memset(book,0,sizeof(book));
memset(dis,0,sizeof(dis));
queue<int>q;
book[1]=1;
dis[1]=100;
q.push(1);
while(!q.empty())
{
int p=q.front();
q.pop();
int k=first[p];
book[p]=0;
cent[p]++;
if(cent[p]>n)//找到负权回路
{
dis[p]=0x3f3f3f3f3f3f3f;
book[p]=1;//以后不进队列
}
while(k!=-1)
{
if(dis[v[k]]<dis[u[k]]+w[k])//----------
{//尽可能找到大的,使剩余能量尽可能大
dis[v[k]]=dis[u[k]]+w[k];
if(!book[v[k]])
{
book[v[k]]=1;
q.push(v[k]);
}
}
k=next1[k];
}
}
if(dis[n]>0)
printf("winnable\n");
else
printf("hopeless\n");
}
int main()
{
while(~scanf("%d",&n)&&(n!=-1))
{
for(int i=0;i<=n;i++)
first[i]=-1;
k=0,j=0;
int t1,t2,t3;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t1,&t2);
for(int j=0;j<t2;j++)
{
scanf("%d",&t3);
u[k]=i,v[k]=t3,w[k]=t1;
next1[k]=first[u[k]];
first[u[k]]=k;
k++;
}
}
SPFA();
}
return 0;
}
HDU - 1317 ~ SPFA正权回路的判断的更多相关文章
- POJ 1860 Currency Exchange(最短路&spfa正权回路)题解
题意:n种钱,m种汇率转换,若ab汇率p,手续费q,则b=(a-q)*p,你有第s种钱v数量,问你能不能通过转化让你的s种钱变多? 思路:因为过程中可能有负权值,用spfa.求是否有正权回路,dis[ ...
- POJ 3259 Wormholes(最短路&spfa正权回路)题解
题意:给你m条路花费时间(双向正权路径),w个虫洞返回时间(单向负权路径),问你他能不能走一圈回到原点之后,时间倒流. 思路:题意有点难看懂,我们建完边之后找一下是否存在负权回路,存在则能,反之不能. ...
- 图论 --- spfa + 链式向前星 : 判断是否存在正权回路 poj 1860 : Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 19881 Accepted: 711 ...
- poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)
链接:poj 1860 题意:给定n中货币.以及它们之间的税率.A货币转化为B货币的公式为 B=(V-Cab)*Rab,当中V为A的货币量, 求货币S通过若干此转换,再转换为原本的货币时是否会添加 分 ...
- Bellman_ford货币兑换——正权回路判断
POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...
- Currency Exchange 货币兑换 Bellman-Ford SPFA 判正权回路
Description Several currency exchange points are working in our city. Let us suppose that each point ...
- [ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)
Arbitrage Problem Description Arbitrage is the use of discrepancies in currency exchange rates to tr ...
- POJ1860-Currency Exchange (正权回路)【Bellman-Ford】
<题目链接> <转载于 >>> > 题目大意: 有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0. ...
- SPFA穿越虫洞——负权回路得判断
poj3259 题目大意:穿越虫洞可以回到过去(时间--)所以能不能让时间倒流呢,就是判断有没有负权回路这次尝试用SPFA算法,也可以复习一下链式前向星 准备工作,队列q,spfa算法得有点就在于这个 ...
随机推荐
- Intellij IDEA 干货分享
更多视频详情:https://www.bilibili.com/video/av89385013/ Intellij IDEA 真是越用越强大 它总是在我们写代码的时候 不时给我们来个小惊喜 出于对 ...
- 树莓派3B安装OpenWrt打造超级路由器
网上有很多树莓派安装OpenWrt的教程,我这里写一下个人安装体验以及踩过的坑
- 「前端」rem 缩放方案 flexible-js 兼容 375px 方案的思路
本文来自尚妆前端团队南洋 发表于尚妆github博客,欢迎订阅. 移动端H5页面rem缩放方案flexible.js兼容375px方案的思路 参考: 移动端高清.多屏适配方案 viewport-and ...
- java线程并发工具类
本次内容主要讲Fork-Join.CountDownLatch.CyclicBarrier以及Callable.Future和FutureTask,最后再手写一个自己的FutureTask,绝对干货满 ...
- vue中犯下的小错误(一)
在开发采筑平台SRM的移动项目中:一个页面,感觉没啥错误,但是页面报错如下: 页面中的data或者mothods都没有任何问题,但是这个报错很是让人纠结,后来发现,在使用子组件时候: 此tabShow ...
- go结构体继承组合和匿名字段
1.结构体方法 go不是纯粹的面向对象的,在go里面函数是一等公民,但是go也有结构体实现类似java一样类的功能来提供抽象.结构体的方法分为值方法和指针方法,前者在方法中做的改变不会改变调用的实例对 ...
- idea新建springboot项目
不多说废话,直接进入正题,按照下面的步骤创建一个springboot项目一般不会出错,当然不排除可能会有一些脸黑的,不过应该问题不大. 第一步,如果你是在已有的项目里面,新建一个springboot项 ...
- python学习列表(Lists).基础二
列表(Lists) 序列是Python中最基本的数据结构,序列中的每个元素都分配一个数字,它的第一个索引是0第二个索引是1,依次类推. 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号 ...
- Vue2.0 【第四季】第1节 实例入门-实例属性
目录 Vue2.0 [第四季]第1节 实例入门-实例属性 第1节 实例入门-实例属性 一.Vue和Jquery.js一起使用 二.实例调用自定义方法 Vue2.0 [第四季]第1节 实例入门-实例属性 ...
- vue中nextTick的使用场景
https://blog.csdn.net/bingqise5193/article/details/100212278