【HDOJ】2242 考研路茫茫——空调教室
tarjan缩点,然后树形dp一下可解。重点是重边的处理。
- /* 2242 */
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <map>
- #include <queue>
- #include <set>
- #include <stack>
- #include <vector>
- #include <deque>
- #include <bitset>
- #include <algorithm>
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <cstring>
- #include <climits>
- #include <cctype>
- #include <cassert>
- #include <functional>
- #include <iterator>
- #include <iomanip>
- using namespace std;
- //#pragma comment(linker,"/STACK:102400000,1024000")
- #define sti set<int>
- #define stpii set<pair<int, int> >
- #define mpii map<int,int>
- #define vi vector<int>
- #define pii pair<int,int>
- #define vpii vector<pair<int,int> >
- #define rep(i, a, n) for (int i=a;i<n;++i)
- #define per(i, a, n) for (int i=n-1;i>=a;--i)
- #define clr clear
- #define pb push_back
- #define mp make_pair
- #define fir first
- #define sec second
- #define all(x) (x).begin(),(x).end()
- #define SZ(x) ((int)(x).size())
- #define lson l, mid, rt<<1
- #define rson mid+1, r, rt<<1|1
- typedef struct {
- int v, nxt;
- } edge_t;
- const int maxv = ;
- const int maxe = ;
- int head[maxv], l;
- edge_t E[maxe];
- int low[maxv], pre[maxv], bn[maxv];
- int S[maxv], top;
- int block, dfs_clock;
- int num[maxv], tot[maxv], sum;
- int head_[maxv], l_;
- edge_t E_[maxe];
- bool visit[maxv];
- int n, m;
- int ans;
- void init() {
- l = block = dfs_clock = ;
- top = ;
- memset(pre, , sizeof(pre));
- memset(bn, , sizeof(bn));
- memset(head, -, sizeof(head));
- }
- void init_() {
- l_ = sum = ;
- memset(tot, , sizeof(tot));
- memset(head_, -, sizeof(head_));
- memset(visit, false, sizeof(visit));
- ans = INT_MAX;
- }
- void addEdge(int u, int v) {
- E[l].v = v;
- E[l].nxt = head[u];
- head[u] = l++;
- E[l].v = u;
- E[l].nxt = head[v];
- head[v] = l++;
- }
- void addEdge_(int u, int v) {
- E_[l_].v = v;
- E_[l_].nxt = head_[u];
- head_[u] = l_++;
- E_[l_].v = u;
- E_[l_].nxt = head_[v];
- head_[v] = l_++;
- }
- void tarjan(int u, int fa) {
- int v, k;
- bool flag = true;
- S[top++] = u;
- pre[u] = low[u] = ++dfs_clock;
- for (k=head[u]; k!=-; k=E[k].nxt) {
- v = E[k].v;
- if (v == fa && flag) {
- flag = false;
- continue;
- }
- if (!pre[v]) {
- tarjan(v, u);
- low[u] = min(low[u], low[v]);
- } else if (!bn[v]) {
- low[u] = min(low[u], pre[v]);
- }
- }
- if (low[u] == pre[u]) {
- ++block;
- do {
- bn[S[--top]] = block;
- } while (S[top]!=u);
- }
- }
- void dfs(int u, int fa) {
- int v, k;
- visit[u] = true;
- for (k=head_[u]; k!=-; k=E_[k].nxt) {
- v = E_[k].v;
- if (v==fa || visit[v])
- continue;
- dfs(v, u);
- tot[u] += tot[v];
- }
- ans = min(ans, abs(sum-tot[u]-tot[u]));
- }
- void solve() {
- rep(i, , n) {
- if (!pre[i])
- tarjan(i, -);
- }
- #ifndef ONLINE_JUDGE
- printf("block = %d\n", block);
- #endif
- if (block <= ) {
- puts("impossible");
- return ;
- }
- init_();
- int u, v, k;
- for (u=; u<n; ++u) {
- tot[bn[u]] += num[u];
- sum += num[u];
- for (k=head[u]; k!=-; k=E[k].nxt) {
- v = E[k].v;
- if (bn[v] != bn[u]) {
- addEdge_(bn[u], bn[v]);
- }
- }
- }
- dfs(, -);
- printf("%d\n", ans);
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifndef ONLINE_JUDGE
- freopen("data.in", "r", stdin);
- freopen("data.out", "w", stdout);
- #endif
- int u, v;
- while (scanf("%d %d", &n, &m)!=EOF) {
- rep(i, , n)
- scanf("%d", &num[i]);
- init();
- rep(i, , m) {
- scanf("%d %d", &u, &v);
- addEdge(u, v);
- }
- solve();
- }
- #ifndef ONLINE_JUDGE
- printf("time = %d.\n", (int)clock());
- #endif
- return ;
- }
数据生成器。
- import sys
- import string
- from random import randint
- def GenData(fileName):
- with open(fileName, "w") as fout:
- t = 10
- for tt in xrange(t):
- n = randint(100, 200)
- m = randint(n/10, n+n/10)
- fout.write("%d %d\n" % (n, m))
- dataList = []
- for i in xrange(n):
- x = randint(0, 1000)
- dataList.append(x)
- fout.write(" ".join(map(str, dataList)) + "\n")
- for i in xrange(m):
- a = randint(0, n)
- b = randint(0, n)
- fout.write("%d %d\n" % (a, b))
- def MovData(srcFileName, desFileName):
- with open(srcFileName, "r") as fin:
- lines = fin.readlines()
- with open(desFileName, "w") as fout:
- fout.write("".join(lines))
- def CompData():
- print "comp"
- srcFileName = "F:\Qt_prj\hdoj\data.out"
- desFileName = "F:\workspace\cpp_hdoj\data.out"
- srcLines = []
- desLines = []
- with open(srcFileName, "r") as fin:
- srcLines = fin.readlines()
- with open(desFileName, "r") as fin:
- desLines = fin.readlines()
- n = min(len(srcLines), len(desLines))-1
- for i in xrange(n):
- ans2 = int(desLines[i])
- ans1 = int(srcLines[i])
- if ans1 > ans2:
- print "%d: wrong" % i
- if __name__ == "__main__":
- srcFileName = "F:\Qt_prj\hdoj\data.in"
- desFileName = "F:\workspace\cpp_hdoj\data.in"
- GenData(srcFileName)
- MovData(srcFileName, desFileName)
【HDOJ】2242 考研路茫茫——空调教室的更多相关文章
- HDU 2242 考研路茫茫——空调教室(边双连通)
HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量.然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include < ...
- HDU 2242 考研路茫茫——空调教室
考研路茫茫——空调教室 http://acm.hdu.edu.cn/showproblem.php?pid=2242 分析: 树形dp,删边. 代码: #include<cstdio> # ...
- HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP
考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更 ...
- HDU 2242 考研路茫茫----空调教室
传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)
http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要 ...
- HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)
<题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...
- HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)
考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2242 双连通分量 考研路茫茫——空调教室
思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...
- 考研路茫茫——空调教室HDU2242(Tarjan缩点)
题意:http://acm.hdu.edu.cn/showproblem.php?pid=2242 给你一个图,问你缩完点树上割边的做小绝对值差. 思路: 这题核算起来整整做了我一天(即24个小时)! ...
随机推荐
- java.imageIo给图片添加水印
最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...
- ecshop中无限处理分类
数据库表记录结构 <?php $sql = "SELECT c.cat_id, c.cat_name, c.measure_unit, c.parent_id, c.is_show, ...
- 修改zepto源代码,使支持wp8的ie10
注意:当前1.1.3版本的zepto,已经有模块来支持wp8 原先的zepto,通过__proto__赋值,来使dom继承到$.fn方法, 无奈IE11之前的IE10,IE9不支持这种写法, 所以我们 ...
- gson小练习之嵌套复杂数据解析
package com.zf.demo; import java.util.List; import com.google.gson.Gson; public class JGson { /** * ...
- 設定 Bootstrap/SASS/Bower/gulp (Windows平台)
請注意:在進行以下步驟前,你會需要先安裝git,可以參考這篇 git安裝教學 前言 時至今日,幾乎每個人都在討論bootstrap.less 或 sass.我們知道它們是比較新的前端技術,而且有開始愈 ...
- php 微信开发之 微信支付 V3 开发 -CURLOP_TIMEOUT问题
如果不懂怎么配置的话请看文章 php 微信开发之 微信支付配置 基本配置后在继续本文章的开发 . 本文章就先继续基本的实现!也并不困难.我大概的思路的返回购买者的唯一id 和 订单号的唯一 id 就2 ...
- 《WPF程序设计指南》读书笔记——第8章 依赖属性
1.依赖属性的效果 一旦规定视觉树上一个对象的fontsize属性,那么属于他的节点之下的所有对象都会沿袭这个属性,然而如果某个子节点明确的设定了自己的fontsize,就不会沿袭父节点的fontsi ...
- ubuntu 设置显示器的亮度
ubuntu电脑重新启动后,亮度都变成了最亮.似乎也没胡地方可以设置.只好通过写个脚本来做这个事了. # -*- coding: utf-8 -*- import dbus bus = dbus.Se ...
- MySQL --log-slave-updates
官方说明:--log-slave-updates Command-Line Format --log-slave-updates Option-File Format log-slave-updat ...
- Java 多线程 简单实例 (消费者与生成者)的关系
PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; pub ...