题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2019

题意:

  奶牛们没钱了,正在找工作。农夫约翰知道后,希望奶牛们四处转转,碰碰运气。

  而且他还加了一条要求:一头牛在一个城市最多只能赚D(1 <= D <= 1,000)美元,然后它必须到另一座城市工作。当然,它可以在别处工作一阵后又回来原来的城市再最多赚D美元。而且这样往往返返的次数没有限制。

  城市间有P (1 <= P <= 150)条单向路径连接,共有N(2 <= N <= 220)座城市,编号1..N. 贝希当前处在城市S (1 <= S <= N)。路径 i 从城市A[i]到城市B[i](1 <= A[i] <= N, 1 <= B[i] <= N),在路径上行走不用花任何费用。

  为了帮助贝希,约翰让它使用他的私人飞机服务。这项服务有F条(1 <= F <= 350)航线,每条航线是从城市J[i]飞到另一座城市K[i](1 <=J[i] <= N, 1 <= K[i] <= N),费用是T[i] (1 <= T[i] <= 50,000)美元。

  如果贝希手中如果没有现钱,可以用以后赚的钱来付机票钱。

  贝希可以选择任何时候,在任何城市退休。

  如果在工作时间上不作限制,贝希总共可以赚多少钱呢?如果赚的钱也不会出现限制,就输出-1。

题解:

  spfa找最长路。

  如果有点入队超过n次,则存在正环,return -1。

  建边:

    (1)对于城市间的道路,边权设为D。

    (2)对于航线,边权设为D - T[i]。

AC Code:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. #include <queue>
  6. #define MAX_N 250
  7.  
  8. using namespace std;
  9.  
  10. struct Edge
  11. {
  12. int dest;
  13. int len;
  14. Edge(int _dest,int _len)
  15. {
  16. dest=_dest;
  17. len=_len;
  18. }
  19. Edge(){}
  20. };
  21.  
  22. int n,p,f,d,s;
  23. int ans;
  24. int dis[MAX_N];
  25. int cnt[MAX_N];
  26. bool vis[MAX_N];
  27. vector<Edge> edge[MAX_N];
  28. queue<int> q;
  29.  
  30. void read()
  31. {
  32. cin>>d>>p>>n>>f>>s;
  33. int a,b,c;
  34. for(int i=;i<p;i++)
  35. {
  36. cin>>a>>b;
  37. edge[a].push_back(Edge(b,d));
  38. }
  39. for(int i=;i<f;i++)
  40. {
  41. cin>>a>>b>>c;
  42. edge[a].push_back(Edge(b,d-c));
  43. }
  44. }
  45.  
  46. int get_front()
  47. {
  48. int now=q.front();
  49. q.pop();
  50. vis[now]=false;
  51. return now;
  52. }
  53.  
  54. void insert(int now)
  55. {
  56. if(vis[now]) return;
  57. q.push(now);
  58. vis[now]=false;
  59. cnt[now]++;
  60. }
  61.  
  62. int spfa(int start)
  63. {
  64. memset(dis,0x80,sizeof(dis));
  65. memset(cnt,,sizeof(cnt));
  66. memset(vis,false,sizeof(vis));
  67. insert(start);
  68. dis[start]=d;
  69. int res=d;
  70. while(!q.empty())
  71. {
  72. int now=get_front();
  73. for(int i=;i<edge[now].size();i++)
  74. {
  75. Edge temp=edge[now][i];
  76. if(dis[temp.dest]<dis[now]+temp.len)
  77. {
  78. dis[temp.dest]=dis[now]+temp.len;
  79. insert(temp.dest);
  80. if(cnt[temp.dest]>n) return -;
  81. res=max(res,dis[temp.dest]);
  82. }
  83. }
  84. }
  85. return res;
  86. }
  87.  
  88. void solve()
  89. {
  90. ans=spfa(s);
  91. }
  92.  
  93. void print()
  94. {
  95. cout<<ans<<endl;
  96. }
  97.  
  98. int main()
  99. {
  100. read();
  101. solve();
  102. print();
  103. }

BZOJ 2019 [Usaco2009 Nov]找工作:spfa【最长路】【判正环】的更多相关文章

  1. 【BZOJ】2019: [Usaco2009 Nov]找工作(spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2019 spfa裸题.....将飞机场的费用变成负,然后spfa找正环就行了 #include < ...

  2. poj 1932 XYZZY(spfa最长路+判断正环+floyd求传递闭包)

    XYZZY Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4154   Accepted: 1185 Description ...

  3. XYZZY spfa 最长路 判环

    题意: 有n个点  m条边  每个边有权值 一开始有一百血  每次经过一条路都会加上其权值 判断是否能够到达n 显然  有正环的时候肯定能够到达 最短路好题!!!!!!! 显用folyed判断是否联通 ...

  4. bzoj2019 [Usaco2009 Nov]找工作

    Description 奶牛们没钱了,正在找工作.农夫约翰知道后,希望奶牛们四处转转,碰碰运气.而且他还加了一条要求:一头牛在一个城市最多只能赚D(1 <= D <= 1,000)美元,然 ...

  5. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  6. BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

    高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...

  7. bzoj 2017 [Usaco2009 Nov]硬币游戏 动态规划

    [Usaco2009 Nov]硬币游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 431  Solved: 240[Submit][Status] ...

  8. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur (SCC缩点,SPFA最长路,枚举反边)

    P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of hi ...

  9. POJ 2240 Arbitrage spfa 判正环

    d[i]代表从起点出发可以获得最多的钱数,松弛是d[v]=r*d[u],求最长路,看有没有正环 然后这题输入有毒,千万别用cin 因为是大输入,组数比较多,然后找字符串用strcmp就好,千万不要用m ...

随机推荐

  1. SAS学习笔记之函数应用

    今天在做数据需求的时候遇到一些问题,因为不能够在数据库里面做,仅仅好在SAS里面实现.这就遇到了一些麻烦,须要使用一些函数实现部分功能,如查找字段中某个特殊字符出现的次数,查找某个字符的位置等,以下一 ...

  2. MFC——9.多线程与线程同步

    Lesson9:多线程与线程同步 程序.进程和线程是操作系统的重点,在计算机编程中.多线程技术是提高程序性能的重要手段. 本文主要解说操作系统中程序.进程和线程之间的关系,并通过相互排斥对象和事件对象 ...

  3. 近期公共祖先(LCA)——离线Tarjan算法+并查集优化

    一. 离线Tarjan算法 LCA问题(lowest common ancestors):在一个有根树T中.两个节点和 e&sig=3136f1d5fcf75709d9ac882bd8cfe0 ...

  4. Uboot的串口下载文件命令:loads / loadb / loady

    1. loads loads [ off ] 通过串口,下载S-Rec文件到off位置 loads命令可以通过串口线下载S-Record格式文件. 2. loadb loadb [ off ] [ b ...

  5. js时间戳格式化成日期格式的多种方法

    js需要把时间戳转为为普通格式,一般的情况下可能用不到的, 下面先来看第一种吧 复制代码代码如下: function getLocalTime(nS) { return new Date(parseI ...

  6. 【PyCharm编辑器】之报:Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click.问题

    如上图,输入一个单词时会出现波浪线,报:Spellchecker inspection helps locate typos and misspelling in your code, comment ...

  7. Go开发常见陷阱

    Go作为一种简便灵巧的语言,深受开发者的喜爱.但对于初学者来说,要想轻松驾驭它,还得做好细节学习工作. 初学者应该注意的地方: 大括号不能独立成行. 未使用变量错误——对于全局变量和函数参数变量,是可 ...

  8. Linux 批量替换的一种实现方式

    替换某目录下所有文件中的某个字符: sed -i 's/origin_str/new_str/g' `grep origin_str -rl ./` origin_str:被替换的字符串: new_s ...

  9. Content encoding error问题解决方法

    A few people have been experiencing the following error. UPDATE: The reason for it happening is beca ...

  10. mac上利用minikube搭建kubernetes(k8s)环境

    友情提示:对于初次接触k8s的同学,强烈建议先看看本文最后的参考文章. 环境: mac os(Mojave) 前提:先安装好kubectl (brew install kubectl) .docker ...