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算法得有点就在于这个 ...
随机推荐
- 随手撸一个简单的带检查的printf
#include <stdio.h> #include <iostream> #include <vector> #include <string> # ...
- 7-41 jmu-python-最佳身高 (10 分)
最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09 =(男方的身高).下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高. 输入格式: 输入第一行给出正整数N(≤10),为前来查询的用 ...
- 前端每日实战:111# 视频演示如何用纯 CSS 创作一只艺术的鸭子
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/aaoveW 可交互视频 此视频是可 ...
- 初窥Mybatis初始化
引言 这篇文章呢,主要是讲Mybtais的两种方式的源码剖析:传统方式以及Mapper代理方式,初次探索Mybatis源码,希望大佬勿喷并且指正错误,谢谢! 个人博客:www.fqcoder.cn 一 ...
- ysoserial源码结构分析
1.前言 之前也花了几天晚上熟悉了一下commonscollections系列的构造,那么学习一下这个项目是如何设计的也挺重要,多学习大佬如何写代码应该也能对自己的代码能力有提升吧~2333 2.项目 ...
- Flutter 裁剪类组件 最全总结
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 ClipRect ClipRect组件使用矩形裁剪子组件, ...
- 脚本写一行echo也能写出bug ? glob了解一下
背景 最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a. 最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的. 又经过 ...
- 最全Redis基础知识
NoSQL概述 什么是NoSQL NoSQL不仅仅是SQL,它是Not Only SQL 的缩写,也是众多非关系型数据库的统称NoSQL和关系型数据库一样,也是用来存储数据的仓库. 为什么需要NoSQ ...
- PHP8年开发经验原创开发文档教程
订阅微信公众号: gzgwgas 每天为你分享PHP开发经验,坚决不踩坑,坚决不入坑. 微信扫码,关注公众号有惊喜!
- plist 图集 php 批量提取 PS 一个个切
最近,迷上了用 cocos2d 做游戏开发.由于是新入门,很多东西从头开始学. 在使用 sprite 的 Rect 裁剪显示的时候,显示总是多一块.所以,要从图集中提取一张张图,这样就省了裁剪. 原图 ...