HDU-4118-Holiday's Accommodation

这个题足以说明我的树形DP之渣~~半天都没想出来,后来一晃眼别人的代码一下子就想到了~

唉~无限悲伤~他们写的都比我好,思路都一样的~

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e5+100;
int n,e,head[maxn],pnt[maxn*2],nxt[maxn*2],cost[maxn*2],cnt[maxn],s[maxn];
long long ans;
bool vis[maxn];
void AddEdge(int u,int v,int c)
{
    pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++;
}
void DFS(int u)
{
    memset(cnt,0,sizeof(cnt));
    int top=0;
    s[top++]=u;
    vis[u]=1;
    while(top)
    {
	int u=s[top-1];
	int flag=0;
	for(int i=head[u];i!=-1;i=nxt[i])
	    if(!vis[pnt[i]])
	    {
		flag=1;
		vis[pnt[i]]=1;
		s[top++]=pnt[i];
	    }
	if(flag)
	    continue;
	top--;
	for(int i=head[u];i!=-1;i=nxt[i])
	{
	    cnt[u]+=cnt[pnt[i]];
	    ans+=min(cnt[pnt[i]],n-cnt[pnt[i]])*cost[i];
	}
	cnt[u]++;
    }
}
int main()
{   
    int T,cas=1;
    scanf("%d",&T);
    while(T--)
    {
	e=ans=0;
	memset(head,-1,sizeof(head));
	memset(vis,0,sizeof(vis));
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
	    int u,v,c;
	    scanf("%d%d%d",&u,&v,&c);
	    AddEdge(u,v,c);
	    AddEdge(v,u,c);
	}
	DFS(1);
	printf("Case #%d: %lld\n",cas++,ans*2);
    }
    return 0;
}


你可能感兴趣的:(树形DP)