zoukankan      html  css  js  c++  java
  • poj 3140 树形去边差异最小

    http://poj.org/problem?id=3140

    依然是差异最小问题,不过这次是去边。思路是这样的,先记录每个点的子节点个数,然后遍历每个边。

    有两个问题要注意:

    abs可能会出编译适配问题,可以自己写一个

    INF对LL是不够用的,所以加了个INFL

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <cctype>
    #include <vector>
    #include <iterator>
    #include <set>
    #include <map>
    #include <sstream>
    using namespace std;
    
    #define mem(a,b) memset(a,b,sizeof(a))
    #define pf printf
    #define sf scanf
    #define spf sprintf
    #define pb push_back
    #define debug printf("!
    ")
    #define MAXN 110000+5
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #define LL long long
    #define ALL(x) x.begin(),x.end()
    #define INS(x) inserter(x,x.begin())
    #define pqueue priority_queue
    #define Rabs(a) (a<0?-a:a)
    #define INF 0x3f3f3f3f
    #define INFL 0x3f3f3f3f3f3f3f3f
    
    int n,m;
    
    struct node{int y,val,next;}tree[MAXN<<2];
    
    int head[MAXN],vis[MAXN],ptr=1,dp[MAXN];
    
    LL num[MAXN],sum,ans,a[MAXN];
    
    void init()
    {
        mem(head,-1);
        mem(vis,0);
        mem(dp,0);
        ans =INFL;
        sum =0;
        ptr=1;
    }
    void add(int x,int y)
    {
        tree[ptr].y = y;
        tree[ptr].next = head[x];
        head[x] = ptr++;
    }
    
    void dfs(int rt)
    {
        vis[rt]=1;
        num[rt] = a[rt];
        for(int i = head[rt];i!=-1;i=tree[i].next)
        {
            int y = tree[i].y;
            if(vis[y]) continue;
            dfs(y);
            num[rt]+=num[y];
        }
    }
    
    int main()
    {
        int i,j,k,kase=1;
        while(~sf("%d%d",&n,&m) && n+m)
        {
            init();
            for(i=1;i<=n;i++)
            {
                sf("%I64d",&a[i]);
                sum+=a[i];
            }
            for(i=1;i<=m;i++)
            {
                int x,y;
                sf("%d%d",&x,&y);
                add(x,y);
                add(y,x);
            }
            dfs(1);
            for(i=1;i<=n;i++)
            {
                for(j=head[i];j!=-1;j=tree[j].next)
                {
                    int y = tree[j].y;
                    LL tp = num[y];
                    ans = min(ans,Rabs((sum-2*tp)));
                    //pf("t%d %d %d %d
    ",i,ans,sum,2*num[y]);
                }
            }
            pf("Case %d: %I64d
    ",kase++,ans);
        }
    }
  • 相关阅读:
    BZOJ 1191 HNOI2006 超级英雄hero
    BZOJ 2442 Usaco2011 Open 修建草坪
    BZOJ 1812 IOI 2005 riv
    OJ 1159 holiday
    BZOJ 1491 NOI 2007 社交网络
    NOIP2014 D1 T3
    BZOJ 2423 HAOI 2010 最长公共子序列
    LCA模板
    NOIP 2015 D1T2信息传递
    数据结构
  • 原文地址:https://www.cnblogs.com/qlky/p/5854953.html
Copyright © 2011-2022 走看看