HDU 5242 Game

来源:互联网 发布:如何自学电脑编程 编辑:程序博客网 时间:2024/06/02 05:29

HDU 5242 Game

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<vector>#define maxn 100005#define ll __int64#define INF 0x3fffffffusing namespace std;ll b[maxn];vector<ll> V[maxn];ll val[maxn];ll a[maxn];ll c[maxn],cor; ll n,m;void Init(){    memset(V,0,sizeof(V));    memset(b,0,sizeof(b));    memset(val,0,sizeof(val));    cor=0;}ll dfs(ll u){    if(val[u]) return val[u];    ll v,t=0;    for(ll i=0;i<V[u].size();i++){        v=V[u][i];        if(b[v]==0){            b[v]=u;            dfs(v);            if(val[v]>val[t]) t=v;        }    }    for(ll i=0;i<V[u].size();i++){        v=V[u][i];        if(b[v]==u){            b[v]=-1;            if(v!=t)                c[cor++]=val[v];        }    }    val[u]=val[t]+a[u];    return val[u];}bool cmp(ll a,ll b){    return a>b;}int main(){    ll T;    scanf("%I64d",&T);    ll ii=1;    while(T--){        scanf("%I64d%I64d",&n,&m);        Init();        for(ll i=1;i<=n;i++) scanf("%I64d",&a[i]);        ll u,v;        for(ll i=0;i<n-1;i++){            scanf("%d%d",&u,&v);            V[u].push_back(v);            V[v].push_back(u);        }        b[1]=-1;        ll t=dfs(1);        c[cor++]=t;        sort(c,c+cor,cmp);        ll ans=0;        for(ll i=0;i<m&&i<cor;i++)            ans+=c[i];        printf("Case #%I64d: %I64d\n",ii++,ans);    }    return 0;}

0 0
原创粉丝点击