//tree-dp,这题要注意的是,直接递归会爆内存,所以要手写一个栈来维护
#include<cstdio>
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
#include<queue>
#define MAXN 100050
#define inf 1000000000
using namespace std;
typedef __int64 LL;
int n,st,tot,top;
LL sum;
int head[MAXN],vis[MAXN];
int stack[MAXN];
LL dp[MAXN];//保存的是以这个点为子树的节点个数
struct edge{
int to;
int next;
LL l;
}edge[MAXN*2];
void add_edge(int a,int b,LL c){
edge[tot].to=b;
edge[tot].l=c;
edge[tot].next=head[a];
head[a]=tot++;
}
void dfs(){
int i;
stack[top++]=1;
vis[1]=1;
while(top>0){
int s=stack[top-1];
int f=0;
for(i=head[s];i!=-1;i=edge[i].next){
int To=edge[i].to;
if(vis[To]) continue;
f=1;
vis[To]=1;
stack[top++]=To;
}
if(f) continue;
top--;
for(i=head[s];i!=-1;i=edge[i].next){
int To=edge[i].to;
int w=edge[i].l;
if(vis[To]){
dp[s]+=dp[To];
sum+=w*min(dp[To],n-dp[To]);
}
}
dp[s]++;
}
}
int main(){
int u,v;
LL l;
int i;
int _;
int ncase=0;
scanf("%d",&_);
while(_--){
scanf("%d",&n);
tot=0;
top=0;
sum=0;
memset(head,-1,sizeof head);
memset(dp,0,sizeof dp);
memset(vis,0,sizeof vis);
for(i=0;i<n-1;i++){
scanf("%d%d%I64d",&u,&v,&l);
add_edge(u,v,l);
add_edge(v,u,l);
}
dfs();
printf("Case #%d: %I64d\n",++ncase,sum*2);
}
}
hdu Holiday's Accommodation
最新推荐文章于 2017-02-19 23:16:18 发布