tarjan缩点,然后树形dp一下可解。重点是重边的处理。

  1. /* 2242 */
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <queue>
  7. #include <set>
  8. #include <stack>
  9. #include <vector>
  10. #include <deque>
  11. #include <bitset>
  12. #include <algorithm>
  13. #include <cstdio>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <cstring>
  17. #include <climits>
  18. #include <cctype>
  19. #include <cassert>
  20. #include <functional>
  21. #include <iterator>
  22. #include <iomanip>
  23. using namespace std;
  24. //#pragma comment(linker,"/STACK:102400000,1024000")
  25.  
  26. #define sti set<int>
  27. #define stpii set<pair<int, int> >
  28. #define mpii map<int,int>
  29. #define vi vector<int>
  30. #define pii pair<int,int>
  31. #define vpii vector<pair<int,int> >
  32. #define rep(i, a, n) for (int i=a;i<n;++i)
  33. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  34. #define clr clear
  35. #define pb push_back
  36. #define mp make_pair
  37. #define fir first
  38. #define sec second
  39. #define all(x) (x).begin(),(x).end()
  40. #define SZ(x) ((int)(x).size())
  41. #define lson l, mid, rt<<1
  42. #define rson mid+1, r, rt<<1|1
  43.  
  44. typedef struct {
  45. int v, nxt;
  46. } edge_t;
  47.  
  48. const int maxv = ;
  49. const int maxe = ;
  50. int head[maxv], l;
  51. edge_t E[maxe];
  52. int low[maxv], pre[maxv], bn[maxv];
  53. int S[maxv], top;
  54. int block, dfs_clock;
  55. int num[maxv], tot[maxv], sum;
  56. int head_[maxv], l_;
  57. edge_t E_[maxe];
  58. bool visit[maxv];
  59. int n, m;
  60. int ans;
  61.  
  62. void init() {
  63. l = block = dfs_clock = ;
  64. top = ;
  65. memset(pre, , sizeof(pre));
  66. memset(bn, , sizeof(bn));
  67. memset(head, -, sizeof(head));
  68. }
  69.  
  70. void init_() {
  71. l_ = sum = ;
  72. memset(tot, , sizeof(tot));
  73. memset(head_, -, sizeof(head_));
  74. memset(visit, false, sizeof(visit));
  75. ans = INT_MAX;
  76. }
  77.  
  78. void addEdge(int u, int v) {
  79. E[l].v = v;
  80. E[l].nxt = head[u];
  81. head[u] = l++;
  82.  
  83. E[l].v = u;
  84. E[l].nxt = head[v];
  85. head[v] = l++;
  86. }
  87.  
  88. void addEdge_(int u, int v) {
  89. E_[l_].v = v;
  90. E_[l_].nxt = head_[u];
  91. head_[u] = l_++;
  92.  
  93. E_[l_].v = u;
  94. E_[l_].nxt = head_[v];
  95. head_[v] = l_++;
  96. }
  97.  
  98. void tarjan(int u, int fa) {
  99. int v, k;
  100. bool flag = true;
  101.  
  102. S[top++] = u;
  103. pre[u] = low[u] = ++dfs_clock;
  104. for (k=head[u]; k!=-; k=E[k].nxt) {
  105. v = E[k].v;
  106. if (v == fa && flag) {
  107. flag = false;
  108. continue;
  109. }
  110.  
  111. if (!pre[v]) {
  112. tarjan(v, u);
  113. low[u] = min(low[u], low[v]);
  114. } else if (!bn[v]) {
  115. low[u] = min(low[u], pre[v]);
  116. }
  117. }
  118.  
  119. if (low[u] == pre[u]) {
  120. ++block;
  121. do {
  122. bn[S[--top]] = block;
  123. } while (S[top]!=u);
  124. }
  125. }
  126.  
  127. void dfs(int u, int fa) {
  128. int v, k;
  129.  
  130. visit[u] = true;
  131. for (k=head_[u]; k!=-; k=E_[k].nxt) {
  132. v = E_[k].v;
  133. if (v==fa || visit[v])
  134. continue;
  135. dfs(v, u);
  136. tot[u] += tot[v];
  137. }
  138.  
  139. ans = min(ans, abs(sum-tot[u]-tot[u]));
  140. }
  141.  
  142. void solve() {
  143. rep(i, , n) {
  144. if (!pre[i])
  145. tarjan(i, -);
  146. }
  147.  
  148. #ifndef ONLINE_JUDGE
  149. printf("block = %d\n", block);
  150. #endif
  151.  
  152. if (block <= ) {
  153. puts("impossible");
  154. return ;
  155. }
  156.  
  157. init_();
  158. int u, v, k;
  159.  
  160. for (u=; u<n; ++u) {
  161. tot[bn[u]] += num[u];
  162. sum += num[u];
  163. for (k=head[u]; k!=-; k=E[k].nxt) {
  164. v = E[k].v;
  165. if (bn[v] != bn[u]) {
  166. addEdge_(bn[u], bn[v]);
  167. }
  168. }
  169. }
  170.  
  171. dfs(, -);
  172. printf("%d\n", ans);
  173. }
  174.  
  175. int main() {
  176. ios::sync_with_stdio(false);
  177. #ifndef ONLINE_JUDGE
  178. freopen("data.in", "r", stdin);
  179. freopen("data.out", "w", stdout);
  180. #endif
  181.  
  182. int u, v;
  183.  
  184. while (scanf("%d %d", &n, &m)!=EOF) {
  185. rep(i, , n)
  186. scanf("%d", &num[i]);
  187. init();
  188. rep(i, , m) {
  189. scanf("%d %d", &u, &v);
  190. addEdge(u, v);
  191. }
  192. solve();
  193. }
  194.  
  195. #ifndef ONLINE_JUDGE
  196. printf("time = %d.\n", (int)clock());
  197. #endif
  198.  
  199. return ;
  200. }

数据生成器。

  1. import sys
  2. import string
  3. from random import randint
  4.  
  5. def GenData(fileName):
  6. with open(fileName, "w") as fout:
  7. t = 10
  8. for tt in xrange(t):
  9. n = randint(100, 200)
  10. m = randint(n/10, n+n/10)
  11. fout.write("%d %d\n" % (n, m))
  12. dataList = []
  13. for i in xrange(n):
  14. x = randint(0, 1000)
  15. dataList.append(x)
  16. fout.write(" ".join(map(str, dataList)) + "\n")
  17. for i in xrange(m):
  18. a = randint(0, n)
  19. b = randint(0, n)
  20. fout.write("%d %d\n" % (a, b))
  21.  
  22. def MovData(srcFileName, desFileName):
  23. with open(srcFileName, "r") as fin:
  24. lines = fin.readlines()
  25. with open(desFileName, "w") as fout:
  26. fout.write("".join(lines))
  27.  
  28. def CompData():
  29. print "comp"
  30. srcFileName = "F:\Qt_prj\hdoj\data.out"
  31. desFileName = "F:\workspace\cpp_hdoj\data.out"
  32. srcLines = []
  33. desLines = []
  34. with open(srcFileName, "r") as fin:
  35. srcLines = fin.readlines()
  36. with open(desFileName, "r") as fin:
  37. desLines = fin.readlines()
  38. n = min(len(srcLines), len(desLines))-1
  39. for i in xrange(n):
  40. ans2 = int(desLines[i])
  41. ans1 = int(srcLines[i])
  42. if ans1 > ans2:
  43. print "%d: wrong" % i
  44.  
  45. if __name__ == "__main__":
  46. srcFileName = "F:\Qt_prj\hdoj\data.in"
  47. desFileName = "F:\workspace\cpp_hdoj\data.in"
  48. GenData(srcFileName)
  49. MovData(srcFileName, desFileName)

【HDOJ】2242 考研路茫茫——空调教室的更多相关文章

  1. HDU 2242 考研路茫茫——空调教室(边双连通)

    HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量.然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include < ...

  2. HDU 2242 考研路茫茫——空调教室

    考研路茫茫——空调教室 http://acm.hdu.edu.cn/showproblem.php?pid=2242 分析: 树形dp,删边. 代码: #include<cstdio> # ...

  3. HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP

    考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更 ...

  4. HDU 2242 考研路茫茫----空调教室

    传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)

    http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要 ...

  6. HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)

    <题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...

  7. HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)

    考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. HDU 2242 双连通分量 考研路茫茫——空调教室

    思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...

  9. 考研路茫茫——空调教室HDU2242(Tarjan缩点)

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=2242 给你一个图,问你缩完点树上割边的做小绝对值差. 思路: 这题核算起来整整做了我一天(即24个小时)! ...

随机推荐

  1. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  2. ecshop中无限处理分类

    数据库表记录结构 <?php $sql = "SELECT c.cat_id, c.cat_name, c.measure_unit, c.parent_id, c.is_show, ...

  3. 修改zepto源代码,使支持wp8的ie10

    注意:当前1.1.3版本的zepto,已经有模块来支持wp8 原先的zepto,通过__proto__赋值,来使dom继承到$.fn方法, 无奈IE11之前的IE10,IE9不支持这种写法, 所以我们 ...

  4. gson小练习之嵌套复杂数据解析

    package com.zf.demo; import java.util.List; import com.google.gson.Gson; public class JGson { /** * ...

  5. 設定 Bootstrap/SASS/Bower/gulp (Windows平台)

    請注意:在進行以下步驟前,你會需要先安裝git,可以參考這篇 git安裝教學 前言 時至今日,幾乎每個人都在討論bootstrap.less 或 sass.我們知道它們是比較新的前端技術,而且有開始愈 ...

  6. php 微信开发之 微信支付 V3 开发 -CURLOP_TIMEOUT问题

    如果不懂怎么配置的话请看文章 php 微信开发之 微信支付配置 基本配置后在继续本文章的开发 . 本文章就先继续基本的实现!也并不困难.我大概的思路的返回购买者的唯一id 和 订单号的唯一 id 就2 ...

  7. 《WPF程序设计指南》读书笔记——第8章 依赖属性

    1.依赖属性的效果 一旦规定视觉树上一个对象的fontsize属性,那么属于他的节点之下的所有对象都会沿袭这个属性,然而如果某个子节点明确的设定了自己的fontsize,就不会沿袭父节点的fontsi ...

  8. ubuntu 设置显示器的亮度

    ubuntu电脑重新启动后,亮度都变成了最亮.似乎也没胡地方可以设置.只好通过写个脚本来做这个事了. # -*- coding: utf-8 -*- import dbus bus = dbus.Se ...

  9. MySQL --log-slave-updates

     官方说明:--log-slave-updates Command-Line Format --log-slave-updates Option-File Format log-slave-updat ...

  10. Java 多线程 简单实例 (消费者与生成者)的关系

    PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; pub ...