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);
}
}
浙公网安备 33010602011771号