POJ 3140

#include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #define MAXN 1000010
    #define LL long long
    const LL INF = 0x7fffffffffffff;
    using namespace std;
    typedef struct{
        int to,next;
    }Node;
    Node edge[2*MAXN];
    int vis[MAXN/10],head[MAXN/10],val[MAXN/10];
    LL sum[MAXN/10],all_sum,ans;
    LL My_abs(LL tmp){return tmp < 0 ? -tmp : tmp;}
    void addedge(int u,int v,int k){
        edge[k].to = v;
        edge[k].next = head[u];
        head[u] = k;
    }
    LL dfs_sum(int s){
        vis[s] = 1;
        sum[s] = val[s];
        for(int i = head[s];~i;i = edge[i].next){
            int u = edge[i].to;
            if(!vis[u]) sum[s] += dfs_sum(u);
        }
        return sum[s];
    }
    void dfs_minabs(int s){
        vis[s]= 1;
        for(int i  = head[s];~i;i = edge[i].next){
            int u = edge[i].to;
            if(!vis[u]){
                dfs_minabs(u);
                ans = min(ans,My_abs(all_sum - 2*sum[u]));
            }
        }
    }
    int main(){
        int n,m,cas = 0;
        freopen("in.c","r",stdin);
        while(~scanf("%d%d",&n,&m) && (m+n) ){
            int k = 1,tmp,u,v;
            all_sum = 0;
            for(int i = 1;i <= n;i ++) scanf("%d",&tmp),val[i] = tmp,all_sum += tmp;
            memset(head,-1,sizeof(head));
            for(int i = 0;i < m;i ++){
                scanf("%d%d",&u,&v);
                addedge(u,v,k++);
                addedge(v,u,k++);
            }
            memset(vis,0,sizeof(vis));
            dfs_sum(1);
            ans = INF;
            memset(vis,0,sizeof(vis));
            dfs_minabs(1);
            if(n == 1) ans = val[1];
            printf("Case %d: %lld\n",++cas,ans);
        }
        return 0;
    }

posted on 2014-04-30 18:39  wangzhili  阅读(95)  评论(0编辑  收藏  举报