poj 3140 Contestants Division

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

一遍DFS 枚举任一条边被切断的情况就可以

代码:

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<queue>

#include<cmath>

#include<stack>

#include<algorithm>

#define LL long long



using namespace std;



const int N=100005;

struct node

{

    LL sum;

    struct tt *next;

}mem[N];

struct tt

{

    int j;

    struct tt *next;

};

LL ans,All;

int a[N];

void build(int i,int j)

{

    struct tt *t=new tt;

    t->j=j;

    t->next=mem[i].next;

    mem[i].next=t;

}

void Dele(int n)

{

    for(int i=1;i<=n;++i)

    {

        mem[i].next=NULL;

    }

}

void updateans(LL k)

{

    LL k1=All-k;

    if(k<k1)

    swap(k,k1);

    if(k-k1<ans)

    ans=k-k1;

}

LL dfs(int x,int pre)

{

    struct tt *t=mem[x].next;

    mem[x].sum=a[x];

    while(t!=NULL)

    {

        if(t->j!=pre)

        {

            mem[x].sum+=dfs(t->j,x);

        }

        t=t->next;

    }

    updateans(mem[x].sum);

    return mem[x].sum;

}

int main()

{

    int n,m;

    int I=0;

    while(scanf("%d %d",&n,&m)!=EOF)

    {

        ++I;

        if(n==0&&m==0)

        break;

        All=0;

        for(int i=1;i<=n;++i)

        {

            scanf("%d",&a[i]);

            All+=a[i];

        }

        while(m--)

        {

            int x,y;

            scanf("%d %d",&x,&y);

            build(x,y);

            build(y,x);

        }

        ans=All;

        dfs(1,-1);

        printf("Case %d: ",I);

        cout<<ans<<endl;

        Dele(n);

    }

}

  

你可能感兴趣的:(visio)