#1185 : 连通性·三

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家。今天一大早,约翰因为有事要出去,就拜托小Hi和小Ho忙帮放牧。

约翰家一共有N个草场,每个草场有容量为W[i]的牧草,N个草场之间有M条单向的路径。

小Hi和小Ho需要将牛羊群赶到草场上,当他们吃完一个草场牧草后,继续前往其他草场。当没有可以到达的草场或是能够到达的草场都已经被吃光了之后,小hi和小Ho就把牛羊群赶回家。

一开始小Hi和小Ho在1号草场,在回家之前,牛羊群最多能吃掉多少牧草?

举个例子:

图中每个点表示一个草场,上部分数字表示编号,下部分表示草场的牧草数量w。

在1吃完草之后,小Hi和小Ho可以选择把牛羊群赶到2或者3,假设小Hi和小Ho把牛羊群赶到2:

吃完草场2之后,只能到草场4,当4吃完后没有可以到达的草场,所以小Hi和小Ho就把牛羊群赶回家。

若选择从1到3,则可以到达5,6:

选择5的话,吃完之后只能直接回家。若选择6,还可以再通过6回到3,再到5。

所以该图可以选择的路线有3条:

  1. 1->2->4 total: 11
  2. 1->3->5 total: 9
  3. 1->3->6->3->5: total: 13

所以最多能够吃到的牧草数量为13。

本题改编自USACO月赛金组

提示:强连通分量

输入

第1行:2个正整数,N,M。表示点的数量N,边的数量M。1≤N≤20,000, 1≤M≤100,000

第2行:N个正整数,第i个整数表示第i个牧场的草量w[i]。1≤w[i]≤100,000

第3..M+2行:2个正整数,u,v。表示存在一条从u到v的单向路径。1≤u,v≤N

输出

第1行:1个整数,最多能够吃到的牧草数量。

样例输入
  1. 6 6
  2. 2 4 3 5 4 4
  3. 1 2
  4. 2 4
  5. 1 3
  6. 3 5
  7. 3 6
  8. 6 3
样例输出
  1. 13

题目链接:hihoCoder 1185

tarjan缩点后重新建立DAG图,然后暴力DFS出最大的值。

代码:

  1. #include <stdio.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define INF 0x3f3f3f3f
  5. #define LC(x) (x<<1)
  6. #define RC(x) ((x<<1)+1)
  7. #define MID(x,y) ((x+y)>>1)
  8. #define CLR(arr,val) memset(arr,val,sizeof(arr))
  9. #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
  10. typedef pair<int, int> pii;
  11. typedef long long LL;
  12. const double PI = acos(-1.0);
  13. const int N = 20010;
  14. const int M = 100010;
  15. struct edge
  16. {
  17. int to, nxt;
  18. };
  19. edge E[M], rE[M];
  20. int head[N], rhead[N], tot, rtot;
  21. int dfn[N], low[N], st[N], ts, scc, top, belong[N], arr[N], block[N];
  22. bool ins[N];
  23. int ans;
  24.  
  25. void init()
  26. {
  27. CLR(head, -1);
  28. CLR(rhead, -1);
  29. tot = rtot = 0;
  30. CLR(dfn, 0);
  31. CLR(low, 0);
  32. ts = scc = top = 0;
  33. CLR(belong, 0);
  34. CLR(block, 0);
  35. CLR(ins, false);
  36. ans = 0;
  37. }
  38.  
  39. inline void add(int s, int t, edge e[], int h[], int &Tot)
  40. {
  41. e[Tot].to = t;
  42. e[Tot].nxt = h[s];
  43. h[s] = Tot++;
  44. }
  45. void Tarjan(int u, const int h[], const edge e[])
  46. {
  47. dfn[u] = low[u] = ++ts;
  48. st[top++] = u;
  49. ins[u] = true;
  50. int i, v;
  51. for (i = h[u]; ~i; i = e[i].nxt)
  52. {
  53. v = e[i].to;
  54. if (!dfn[v])
  55. {
  56. Tarjan(v, h, e);
  57. low[u] = min(low[u], low[v]);
  58. }
  59. else if (ins[v])
  60. low[u] = min(low[u], dfn[v]);
  61. }
  62. if (low[u] == dfn[u])
  63. {
  64. ++scc;
  65. do
  66. {
  67. v = st[--top];
  68. belong[v] = scc;
  69. ins[v] = false;
  70. } while (u != v);
  71. }
  72. }
  73. void dfs(int u, int sum)
  74. {
  75. sum += block[u];
  76. if (sum > ans)
  77. ans = sum;
  78. for (int i = rhead[u]; ~i; i = rE[i].nxt)
  79. {
  80. int v = rE[i].to;
  81. dfs(v, sum);
  82. }
  83. }
  84. int main(void)
  85. {
  86. int n, m, a, b, i, j;
  87. while (~scanf("%d%d", &n, &m))
  88. {
  89. init();
  90. for (i = 1; i <= n; ++i)
  91. scanf("%d", arr + i);
  92. for (i = 0; i < m; ++i)
  93. {
  94. scanf("%d%d", &a, &b);
  95. add(a, b, E, head, tot);
  96. }
  97. for (i = 1; i <= n; ++i)
  98. if (!dfn[i])
  99. Tarjan(i, head, E);
  100. for (i = 1; i <= n; ++i)
  101. {
  102. block[belong[i]] += arr[i];
  103. arr[i] = 0;
  104. }
  105. for (i = 1; i <= n; ++i)
  106. {
  107. for (j = head[i]; ~j; j = E[j].nxt)
  108. {
  109. b = E[j].to;
  110. if (belong[i] != belong[b])
  111. {
  112. add(belong[i], belong[b], rE, rhead, rtot);
  113. }
  114. }
  115. }
  116. dfs(belong[1], 0);
  117. printf("%d\n", ans);
  118. }
  119. return 0;
  120. }

hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)的更多相关文章

  1. HihoCoder 1185 : 连通性·三(强连通缩点)

    连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出去,就拜托小Hi ...

  2. hihoCoder #1185 : 连通性·三(强联通分量+拓扑排序)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  3. HDU 3639 Hawk-and-Chicken(Tarjan缩点+反向DFS)

    Problem Description Kids in kindergarten enjoy playing a game called Hawk-and-Chicken. But there alw ...

  4. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

  5. 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1685  Solved: 724[Submit] ...

  6. poj3694(tarjan缩点+lca)

    传送门:Network 题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥. 分析:方法(1219ms):用并查集缩点,把不是桥的点缩成一个点,然后全图都是桥 ...

  7. BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点

    题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过 ...

  8. P1262 间谍网络 (tarjan缩点 水过去)

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...

  9. hdu6165(拓扑排序+tarjan缩点)

    题意:就任意两个点能否到达: 解题思路:首先将图简化,比如假设图里有一个环,那么,这环内两个点肯定是能相互到达的,那么就不用考虑这环内的点了,很简单就想到用tarjan算法将环缩成一个点,然后就是判断 ...

随机推荐

  1. 用JS获取地址栏参数的方法

    采用正则表达式获取地址栏参数: function GetQueryString(name) {      var reg = new RegExp("(^|&)"+ nam ...

  2. 02第一个OC程序

    一.打开XCode4.6.3,新建项目 二.选择Application下的命名行项目 三.输入项目名称,选择Foundation框架创建项目,点击Next 四.二话不说.点击Run.启动我们创建的项目 ...

  3. POJ2914 (未解决)无向图最小割|Stoer-Wagner算法|模板

    还不是很懂,贴两篇学习的博客: http://www.hankcs.com/program/algorithm/poj-2914-minimum-cut.html http://blog.sina.c ...

  4. Android-做个性化的进度条

    1.案例效果图 2.准备素材                                progress1.png(78*78)              progress2.png(78*78) ...

  5. Qt界面中嵌入其他exe程序的界面,使用Qt5

    下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示.本文参考了 http://blog.csdn.net/jiaoyaziyang/article/details/4 ...

  6. c语言中的一些注意点

    1.头文件两种形式的区别(#include<mystring.h>与#include"mystring.h") 当运行一个程序时,需要调用自己写的函数时,需要在头文件加 ...

  7. ViewState与Session [转]

    昨天偶然看到网上有人讨论究竟是该用viewstate还是session来保存信息. 忽然觉得有必要去深入的研究一下这两个东东了,我们先来看深入分析一下viewstate, 为了分析的相对完整性,先从简 ...

  8. UIPickerView选择器的使用方法

    UIPickerView是选择列表内容的控件 使用方法与UITableView类似 都需要用array传入数据 用Delegate DataSource中的代理方法实现各种显示功能 @interfac ...

  9. iOS8系统H264视频硬件编解码说明

    公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...

  10. 1 javascript 核心语言笔记

    //所有的双斜线之后的内容都属于注释; //变量是表示值的一个符号名字; //变量是通过var 关键字声明的; var x; //声明一个变量 //值可以通过等号赋值给变量 x = 0; //现在的变 ...