Poj3140求樹重心

//編譯錯了兩次,原因:
abs(a),a不能是LL類型

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL inf=1e17;
const int num_e=2*1e6+10;
struct node
{
    int v,next;
}e[num_e];
int head[num_e],cnt;
LL dp[num_e],a[num_e],ans=inf,sum;
int n;
void int_i(void)
{
    memset(head,0,sizeof(head));
    memset(dp,0,sizeof(dp));
    cnt=0;
    ans=inf;
    sum=0;
    return ;
}
void addedge(int u,int v)
{
    e[++cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
    return ;
}
void dfs(int u,int f)
{
    LL m1=0,m2=0;
    dp[u]=a[u];
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].v;
        if(v==f) continue;
        dfs(v,u);
        dp[u]+=dp[v];
        m1=max(m1,dp[v]);
    }

    m2=max(m1,sum-dp[u]);

    if(m2<ans)
    {
        ans=m2;
    }
    return;
}
int main()
{
    int m,u,v,k;
    k=0;
    while(scanf("%d%d",&n,&m)&&(n||m))
    {
        int_i();

        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            sum+=a[i];
        }

        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }

        dfs(1,-1);
        LL t=sum-2*ans;
        if(t<0) t=-t;
        printf("Case %d: %lld\n",++k,t);

    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章