POJ-3140 Contestants Division (树)
题目大意:一棵树,带点权。将这棵树分成两部分,找出使得两部分的点权和的差最小。
题目分析:直接dfs即可。找出每棵子树u的点权和size(u),如果以u和它的父节点之间的边为界,那么两边的点权和分别为sum-size(u)和size(u)。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
# include<list>
# include<set>
# include<map>
# include<string>
# include<cmath>
# include<cstdlib>
# include<algorithm>
using namespace std;
# define LL long long const int N=1005;
const int INF=1000000000;
const LL oo=0x7fffffffffffffff; struct Edge
{
int to,nxt;
};
Edge e[N*200];
int n,m,cnt;
int head[N*100];
int w[N*100];
LL sum;
LL size[N*100];
int vis[N*100]; void add(int u,int v)
{
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt++;
} void init()
{
cnt=0;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
sum=0;
for(int i=1;i<=n;++i){
scanf("%d",w+i);
sum+=(LL)w[i];
}
int a,b;
for(int i=0;i<m;++i){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
} void dfs(int u,int fa)
{
size[u]=w[u];
vis[u]=1;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(v==fa||vis[v]) continue;
dfs(v,u);
size[u]+=size[v];
}
} LL solve()
{
dfs(1,-1);
LL ans=oo;
for(int i=1;i<=n;++i){
LL t=max(sum-size[i],size[i])-min(sum-size[i],size[i]);
if(t<ans) ans=t;
}
return ans;
} int main()
{
int cas=0;
while(scanf("%d%d",&n,&m)&&(n+m))
{
init();
printf("Case %d: %lld\n",++cas,solve());
}
return 0;
}
POJ-3140 Contestants Division (树)的更多相关文章
- POJ 3140 Contestants Division (树dp)
		题目链接:http://poj.org/problem?id=3140 题意: 给你一棵树,问你删去一条边,形成的两棵子树的节点权值之差最小是多少. 思路: dfs #include <iost ... 
- POJ 3140.Contestants Division 基础树形dp
		Contestants Division Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10704 Accepted: ... 
- POJ 3140 Contestants Division 树形DP
		Contestants Division Description In the new ACM-ICPC Regional Contest, a special monitoring and su ... 
- POJ 3140 Contestants Division
		题目链接 题意很扯,就是给一棵树,每个结点有个值,然后把图劈成两半,差值最小,反正各种扯. 2B错误,导致WA了多次,无向图,建图搞成了有向了.... #include <cstdio> ... 
- poj 3140 Contestants Division(树形dp? dfs计数+枚举)
		本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ... 
- POJ 3140 Contestants Division 【树形DP】
		<题目链接> 题目大意:给你一棵树,让你找一条边,使得该边的两个端点所对应的两颗子树权值和相差最小,求最小的权值差. 解题分析: 比较基础的树形DP. #include <cstdi ... 
- poj 3140 Contestants Division [DFS]
		题意:一棵树每个结点上都有值,现删掉一条边,使得到的两棵树上的数值和差值最小. 思路:这个题我直接dfs做的,不知道树状dp是什么思路..一开始看到数据规模有些后怕,后来想到long long 可以达 ... 
- POJ 3140 Contestants Division (树形DP,简单)
		题意: 有n个城市,构成一棵树,每个城市有v个人,要求断开树上的一条边,使得两个连通分量中的人数之差最小.问差的绝对值.(注意本题的M是没有用的,因为所给的必定是一棵树,边数M必定是n-1) 思路: ... 
- POJ 2378 Tree Cutting 3140 Contestants Division (简单树形dp)
		POJ 2378 Tree Cutting:题意 求删除哪些单点后产生的森林中的每一棵树的大小都小于等于原树大小的一半 #include<cstdio> #include<cstri ... 
- POJ 3104 Contestants Division
		Contestants Division Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10597 Accepted: ... 
随机推荐
- KMP算法中next函数的理解
			首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ... 
- android asyncTask   详解
			只看http://www.cnblogs.com/xiaoluo501395377/p/3430542.html 足以 
- 管理Fragment
			转载原地址:http://blog.csdn.net/harvic880925/article/details/44927375 相关文章: 1.<Fragment详解之一——概述>2.& ... 
- <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
			//矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ... 
- MAT
			http://www.yrom.net/blog/2014/08/29/eclipse-mat/ 
- ios 从网络上获取图片并在UIImageView中显示
			ios 从网络上获取图片 -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIIm ... 
- 1、网页制作Dreamweaver(界面、基本操作、锚点、表格)
			界面 网页的界面html由两部分组成:<head>和<body>,<title>放在<head>中 1.以下是<head>部分的解释: &l ... 
- 学习和使用PHP应该注意的10件事
			1 多阅读手册和源代码 没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西,特别是很多有关于字符串和数组的 函数.就在这些函数里面包括许多有用的功能,如果你仔细阅读手册,你会经常 ... 
- iOS-申请开发证书流程
			1.开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution),这个是最基础的,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证 ... 
- matlab产生正态分布样本
			mvnrnd - Multivariate normal random numbers This MATLAB function returns an n-by-d matrix R of rando ... 
