题意:有最多一百个房间,房间之间连通,到达另一个房间会消耗能量值或者增加能量值,求是否能从一号房间到达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

看代码吧:

  1. #include<queue>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int cent[12010],u[12010],v[12010],w[12010],dis[12010],book[12010],first[12010],next1[12010];
  6. int k,j=0,n,m,l,t1,t2,inf=-0x3f3f3f3f;
  7. void SPFA()
  8. {
  9. memset(cent,0,sizeof(cent));//计算点进入队列的次数
  10. memset(book,0,sizeof(book));
  11. memset(dis,0,sizeof(dis));
  12. queue<int>q;
  13. book[1]=1;
  14. dis[1]=100;
  15. q.push(1);
  16. while(!q.empty())
  17. {
  18. int p=q.front();
  19. q.pop();
  20. int k=first[p];
  21. book[p]=0;
  22. cent[p]++;
  23. if(cent[p]>n)//找到负权回路
  24. {
  25. dis[p]=0x3f3f3f3f3f3f3f;
  26. book[p]=1;//以后不进队列
  27. }
  28. while(k!=-1)
  29. {
  30. if(dis[v[k]]<dis[u[k]]+w[k])//----------
  31. {//尽可能找到大的,使剩余能量尽可能大
  32. dis[v[k]]=dis[u[k]]+w[k];
  33. if(!book[v[k]])
  34. {
  35. book[v[k]]=1;
  36. q.push(v[k]);
  37. }
  38. }
  39. k=next1[k];
  40. }
  41. }
  42. if(dis[n]>0)
  43. printf("winnable\n");
  44. else
  45. printf("hopeless\n");
  46. }
  47. int main()
  48. {
  49. while(~scanf("%d",&n)&&(n!=-1))
  50. {
  51. for(int i=0;i<=n;i++)
  52. first[i]=-1;
  53. k=0,j=0;
  54. int t1,t2,t3;
  55. for(int i=1;i<=n;i++)
  56. {
  57. scanf("%d%d",&t1,&t2);
  58. for(int j=0;j<t2;j++)
  59. {
  60. scanf("%d",&t3);
  61. u[k]=i,v[k]=t3,w[k]=t1;
  62. next1[k]=first[u[k]];
  63. first[u[k]]=k;
  64. k++;
  65. }
  66. }
  67. SPFA();
  68. }
  69. return 0;
  70. }

HDU - 1317 ~ SPFA正权回路的判断的更多相关文章

  1. POJ 1860 Currency Exchange(最短路&spfa正权回路)题解

    题意:n种钱,m种汇率转换,若ab汇率p,手续费q,则b=(a-q)*p,你有第s种钱v数量,问你能不能通过转化让你的s种钱变多? 思路:因为过程中可能有负权值,用spfa.求是否有正权回路,dis[ ...

  2. POJ 3259 Wormholes(最短路&spfa正权回路)题解

    题意:给你m条路花费时间(双向正权路径),w个虫洞返回时间(单向负权路径),问你他能不能走一圈回到原点之后,时间倒流. 思路:题意有点难看懂,我们建完边之后找一下是否存在负权回路,存在则能,反之不能. ...

  3. 图论 --- spfa + 链式向前星 : 判断是否存在正权回路 poj 1860 : Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19881   Accepted: 711 ...

  4. poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)

    链接:poj 1860 题意:给定n中货币.以及它们之间的税率.A货币转化为B货币的公式为 B=(V-Cab)*Rab,当中V为A的货币量, 求货币S通过若干此转换,再转换为原本的货币时是否会添加 分 ...

  5. Bellman_ford货币兑换——正权回路判断

    POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...

  6. Currency Exchange 货币兑换 Bellman-Ford SPFA 判正权回路

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  7. [ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)

    Arbitrage Problem Description Arbitrage is the use of discrepancies in currency exchange rates to tr ...

  8. POJ1860-Currency Exchange (正权回路)【Bellman-Ford】

    <题目链接> <转载于 >>> > 题目大意: 有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0. ...

  9. SPFA穿越虫洞——负权回路得判断

    poj3259 题目大意:穿越虫洞可以回到过去(时间--)所以能不能让时间倒流呢,就是判断有没有负权回路这次尝试用SPFA算法,也可以复习一下链式前向星 准备工作,队列q,spfa算法得有点就在于这个 ...

随机推荐

  1. go微服务框架kratos学习笔记十(熔断器)

    目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...

  2. py基础之数据类型及基本语法

    '''python中有五种数据类型,分别是整数.浮点数.字符串.布尔值.空值'''a = 1b = 2.0c = 'hello,world'print (a,b,c)#a是整数,b是浮点数,c是字符串 ...

  3. XML学习笔记--背诵版

    前言 一直想系统性的学XML,就没时间学,今晚抽出几个小时时间学完了XML.过几天再过来看看,背一背应该就差不多,记得东西较多,没什么难理解的. XML数据传输格式 第一章 XML概述 1.1 引入 ...

  4. java 构造器(构造方法)使用详细说明

    知识点 什么是构造器 构造器通常也叫构造方法.构造函数,构造器在每个项目中几乎无处不在.当你new一个对象时,就会调用构造器.构造器格式如下: [修饰符,比如public] 类名 (参数列表,可以没有 ...

  5. fork他人仓库文件及修改整合

    1.首先使用浏览器打开自己的GitHub地址,并打开即将fork的文件地址(别人的文件地址),在其右上方找到fork选项并点击即可 2.在自己的电脑上创建一个文件夹后使用git bush here的C ...

  6. 误删除所有redo日志的一组成员的处理过程

    系统中共有3个日志文件组,每个组中各有一个日志文件成员.往系统中添加一个日志文件组,组中日志文件成员数量是2.SQL> alter database add logfile group 4 (' ...

  7. Nginx之负载均衡配置(二)

    前文我们聊到了nginx作为负载均衡的配置,前端nginx作为调度器调度http或https请求,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12458159 ...

  8. openwrt 为软件包添加服务

    手动修改 rc.local 加入也可以实现自启动,缺点手动修改太麻烦,停止只能用 kill . 配置成服务最方便了,可以启用或禁用,启动,停止,重启非常方便. 在openwrt 中使用服务 servi ...

  9. 7,MapReduce基础

    目录 MapReduce基础 一.关于MapReduce 二.MapReduce的优缺点 三.MapReduce的执行流程 四.编写MapReduce程序 五.MapReduce的主要执行流程 Map ...

  10. Flutter json 2 model with Built Value

    Flutter json 2 model with Built Value Flutter中json转换model, 除了手动转之外, 就是利用第三方库做一些代码生成. 流行的库有: json_ser ...