poj 3140 Contestants Division
来源:互联网 发布:音乐加快节奏软件 编辑:程序博客网 时间:2024/05/15 07:33
/*题意:给出一棵树,每个节点有一个权值,要求去掉一条边所能获得的两棵树的最小的权值差DFS遍历一遍,枚举断点,(简单题)*/#include<iostream>#include<cstdio>#include<cstring>#include<vector>#define MAXSIZE 105000#define sf scanf#define pf printf#define __int64 long long#define INF 0xfffffffusing namespace std;int a[MAXSIZE],vis[MAXSIZE],v[MAXSIZE];long long sum,dp[MAXSIZE];vector<int> tree[MAXSIZE];long long Abs(long long x){ if(x>=0) return x; else return -x;}void DFS(int r){ vis[r]=1; dp[r]=a[r]; int size=tree[r].size(); for(int i=0;i<size;i++) { if(!vis[tree[r][i]]) { DFS(tree[r][i]); dp[r]+=dp[tree[r][i]]; } }}int main(){ int n,m; int test=0; while(sf("%d%d",&n,&m),m+n) { sum=0; for(int i=0;i<=n;i++) { dp[i]=0; vis[i]=0; tree[i].clear(); } for(int i=1;i<=n;i++) { sf("%d",&a[i]); sum+=a[i]; } int u,v; for(int i=1;i<=m;i++) { sf("%d%d",&u,&v); tree[u].push_back(v); tree[v].push_back(u); } DFS(1); long long ans=Abs(sum-dp[1]-dp[1]); for(int i=2;i<=n;i++) { ans=min(ans,Abs(sum-dp[i]-dp[i])); } pf("Case %d: %lld\n",++test,ans); }}