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);        }}


原创粉丝点击