POJ 3140 Contestants Division 树形DP
2016-07-20 20:53
417 查看
[b]Contestants Division[/b]
[b]Description[/b]
In the new ACM-ICPC Regional Contest, a special monitoring and submitting system will be set up, and students will be able to compete at their own universities. However there’s one problem. Due to the high cost of the new judging system, the organizing committee can only afford to set the system up such that there will be only one way to transfer information from one university to another without passing the same university twice. The contestants will be divided into two connected regions, and the difference between the total numbers of students from two regions should be minimized. Can you help the juries to find the minimum difference?
[b]Input[/b]
There are multiple test cases in the input file. Each test case starts with two integers N and M, (1 ≤ N ≤ 100000, 1 ≤ M ≤ 1000000), the number of universities and the number of direct communication line set up by the committee, respectively. Universities are numbered from 1 to N. The next line has N integers, the Kth integer is equal to the number of students in university numbered K. The number of students in any university does not exceed 100000000. Each of the following M lines has two integers s, t, and describes a communication line connecting university s and university t. All communication lines of this new system are bidirectional.
N = 0, M = 0 indicates the end of input and should not be processed by your program.
[b]Output[/b]
For every test case, output one integer, the minimum absolute difference of students between two regions in the format as indicated in the sample output.
[b]Sample Input[/b]
[b]Sample Output[/b]
[b]题意:[/b]
给你一个n点的树,
每个点有权值,现在让你删除一条边,使得剩下的两个子树的权值和差值最小,并输出
[b]题解;[/b]
我们以1为根做一遍DP
求出dp[i] 以i为根节点的子树权值总和
再枚举删除哪一条边即可
[b]Description[/b]
In the new ACM-ICPC Regional Contest, a special monitoring and submitting system will be set up, and students will be able to compete at their own universities. However there’s one problem. Due to the high cost of the new judging system, the organizing committee can only afford to set the system up such that there will be only one way to transfer information from one university to another without passing the same university twice. The contestants will be divided into two connected regions, and the difference between the total numbers of students from two regions should be minimized. Can you help the juries to find the minimum difference?
[b]Input[/b]
There are multiple test cases in the input file. Each test case starts with two integers N and M, (1 ≤ N ≤ 100000, 1 ≤ M ≤ 1000000), the number of universities and the number of direct communication line set up by the committee, respectively. Universities are numbered from 1 to N. The next line has N integers, the Kth integer is equal to the number of students in university numbered K. The number of students in any university does not exceed 100000000. Each of the following M lines has two integers s, t, and describes a communication line connecting university s and university t. All communication lines of this new system are bidirectional.
N = 0, M = 0 indicates the end of input and should not be processed by your program.
[b]Output[/b]
For every test case, output one integer, the minimum absolute difference of students between two regions in the format as indicated in the sample output.
[b]Sample Input[/b]
7 6 1 1 1 1 1 1 1 1 2 2 7 3 7 4 6 6 2 5 7 0 0
[b]Sample Output[/b]
Case 1: 1
[b]题意:[/b]
给你一个n点的树,
每个点有权值,现在让你删除一条边,使得剩下的两个子树的权值和差值最小,并输出
[b]题解;[/b]
我们以1为根做一遍DP
求出dp[i] 以i为根节点的子树权值总和
再枚举删除哪一条边即可
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int N = 1e5+20, M = 1e2+10, mod = 1e9+7, inf = 1e9+1000; typedef long long ll; int n,m,a ,b ; ll v ,dp ; vector < int > G ; void dfs(int u,int fa) { dp[u] = v[u]; for(int i=0;i<G[u].size();i++) { int to = G[u][i]; if(to == fa) continue; dfs(to,u); dp[u] += dp[to]; } } int main() { int cas = 1; while(~scanf("%d%d",&n,&m)) { if(!n&&!m) break; memset(dp,0,sizeof(dp)); ll all = 0; for(int i=1;i<=n;i++) scanf("%I64d",&v[i]),all+=v[i]; for(int i=1;i<=n;i++) G[i].clear(); for(int i=1;i<=m;i++) { scanf("%d%d",&a[i],&b[i]); G[a[i]].push_back(b[i]);G[b[i]].push_back(a[i]); } dfs(1,-1); ll ans = 1e18; for(int i=1;i<=m;i++) if(all - min(dp[b[i]],dp[a[i]]) - min(dp[b[i]],dp[a[i]]) < 0) ans = min(ans, - all + min(dp[b[i]],dp[a[i]]) + min(dp[b[i]],dp[a[i]])); else ans = min(ans, all - min(dp[b[i]],dp[a[i]]) - min(dp[b[i]],dp[a[i]])); printf("Case %d: %I64d\n",cas++,ans); } }
相关文章推荐
- HDOJ 1715 大菲波数
- PWM波形输出
- poj 2456
- poj3186
- HDU 4965 Fast Matrix Calculation
- /etc/目录
- bug修复记录
- RabbitMQ and Oslo.messaging
- ★路由递归查询方法及相关图示【转载】
- ★路由递归查询方法及相关图示【转载】
- ★路由递归查询方法及相关图示【转载】
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
- Codeforces Round #330 (Div. 2) B 容斥原理
- VM12安装一个干净的CentOS-6.5(mini版本)
- 弹性滑动的实现与工作原理
- C语言如何"实现"面向对象?
- Memcached入门
- eclipse中egit插件使用
- hdu 5279 Rigid Frameworks
- iscroll