hdu 5886 Tower Defence 2016ACM/ICPC青岛赛区网络赛1009
来源:互联网 发布:活动报名网站源码 编辑:程序博客网 时间:2024/05/29 11:38
Problem Description
There was a civil war between two factions in Skyrim, a province of the Empire on the continent of Tamriel. The Stormcloaks, led by Ulfric Stormcloak, are made up of Skyrim's native Nord race. Their goal is an independent Skyrim free from Imperial interference. The Imperial Legion, led by General Tullius, is the military of the Empire that opposes the Stormcloaks and seeks to reunite and pacify the province.
The current target of General Tullius is to defend Whiterun City. Near by this city there areN towers under the Empire's control. There are N−1 roads link these tower, so solders can move from any tower to another one through these roads.
In military affairs, tactical depth means the longest path between two towers of all. Larger the tactical depth is, more stable these towers are.
According to the message sent by spies, General Tullius believe that Stormcloaks is planning to attack one of these roads, and his towers would be divided into two parts. However, Tullius does not know which one, so he supposes the possibility that Stormcloaks attack these roads are the same. Now, General Tullius ask for your help, to calculate the expectation of tactical depth after this attack.
To avoid the issue of precision, you need to calculateexpectationoftacticaldepth×(N−1) .
The current target of General Tullius is to defend Whiterun City. Near by this city there are
In military affairs, tactical depth means the longest path between two towers of all. Larger the tactical depth is, more stable these towers are.
According to the message sent by spies, General Tullius believe that Stormcloaks is planning to attack one of these roads, and his towers would be divided into two parts. However, Tullius does not know which one, so he supposes the possibility that Stormcloaks attack these roads are the same. Now, General Tullius ask for your help, to calculate the expectation of tactical depth after this attack.
To avoid the issue of precision, you need to calculate
Input
The first line of input contains an integer t , the number of test cases. t test cases follow.
For each test case, in the first line there is an integerN(N≤100000) .
Thei -th line of the next N−1 lines describes the i -th edge. Three integers u,v,w (0≤w≤1000) describe an edge between u and v of length w .
For each test case, in the first line there is an integer
The
Output
For each test cases, output expectationoftacticaldepth×(N−1) .
Sample Input
232 1 23 2 552 1 73 1 74 2 55 2 6
Sample Output
763
给你一棵树,枚举删除每一条边,求剩下的直径之和
首先如果删除的边不在直径上,那贡献就是直径
如果删除的在直径上。我们假设一条直径的起点是L终点是R
那么我们分别以L和R为根处理每个子树的内部最大直径
然后统计一下就可以了
#include<map>#include<cmath>#include<queue>#include<vector>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct line{int s,t;int x;int next;}a[200001];int head[100001];int edge;inline void add(int s,int t,int x){a[edge].next=head[s];head[s]=edge;a[edge].s=s;a[edge].t=t;a[edge].x=x;}int fa[100001];long long son1[100001],son2[100001];int sonx1[100001],sonx2[100001];int dep[100001][3];inline void dfs1(int d){son1[d]=0;sonx1[d]=0;son2[d]=0;sonx2[d]=0;int i;for(i=head[d];i!=0;i=a[i].next){int t=a[i].t;if(t!=fa[d]){fa[t]=d;dfs1(t);if(son1[t]+a[i].x>=son1[d]){son2[d]=son1[d];sonx2[d]=sonx1[d];son1[d]=son1[t]+a[i].x;sonx1[d]=t;}else if(son1[t]+a[i].x>=son2[d]){son2[d]=son1[t]+a[i].x;sonx2[d]=t;}}}}bool v[100001];bool vx[100001];inline int findline(int d,int x){vx[d]=true;if(sonx1[d]==0)return d;dep[sonx1[d]][x]=dep[d][x]+1;return findline(sonx1[d],x);}long long ans[3][100001];inline void trdp(int d,int x){son1[d]=0;sonx1[d]=0;son2[d]=0;sonx2[d]=0;v[d]=true;int i;long long maxx=0;for(i=head[d];i!=0;i=a[i].next){int t=a[i].t;if(!v[t]){trdp(t,x);maxx=max(maxx,ans[x][t]);if(son1[t]+a[i].x>=son1[d]){son2[d]=son1[d];sonx2[d]=sonx1[d];son1[d]=son1[t]+a[i].x;sonx1[d]=t;}else if(son1[t]+a[i].x>=son2[d]){son2[d]=son1[t]+a[i].x;sonx2[d]=t;}}}ans[x][d]=max(son1[d]+son2[d],maxx);}int main(){// freopen("1009.in", "r", stdin);// freopen("1009.out", "w", stdout);int T;scanf("%d",&T);while(T>0){T--;edge=0;memset(head,0,sizeof(head)); int n;scanf("%d",&n);int i;int s,t,x;for(i=1;i<=n-1;i++){scanf("%d%d%d",&s,&t,&x);edge++;add(s,t,x);edge++;add(t,s,x);}memset(fa,0,sizeof(fa));dfs1(1);long long maxx=0,maxi=0;for(i=1;i<=n;i++){if(son1[i]+son2[i]>maxx){maxx=son1[i]+son2[i];maxi=i;}}int l,r;memset(dep,0,sizeof(dep));memset(vx,false,sizeof(vx));dep[sonx1[maxi]][1]=1;dep[sonx2[maxi]][2]=1;vx[maxi]=true;l=findline(sonx1[maxi],1);r=findline(sonx2[maxi],2);if(r==0)r=maxi;memset(ans,0,sizeof(ans));memset(v,false,sizeof(v));trdp(l,1);memset(v,false,sizeof(v));trdp(r,2);long long ansx=0;for(i=1;i<=edge;i+=2){s=a[i].s;t=a[i].t;if(vx[s]&&vx[t]){if(dep[s][1]<dep[t][1])ansx+=max(ans[1][s],ans[2][t]);else if(dep[s][1]>dep[t][1])ansx+=max(ans[2][s],ans[1][t]);else if(dep[s][2]<dep[t][2])ansx+=max(ans[2][s],ans[1][t]);else if(dep[s][2]>dep[t][2])ansx+=max(ans[1][s],ans[2][t]);}elseansx+=maxx;}printf("%I64d\n",ansx);}return 0;}
0 0
- hdu 5886 Tower Defence 2016ACM/ICPC青岛赛区网络赛1009
- 2016 ACM/ICPC 青岛赛区网络赛 XM Reserves
- hdu 5878 I Count Two Three 2016ACM/ICPC青岛赛区网络赛1001
- hdu 5879 Cure 2016ACM/ICPC青岛赛区网络赛1002
- hdu 5881 Tea 2016ACM/ICPC青岛赛区网络赛1004
- hdu 5882 Balanced Game 2016ACM/ICPC青岛赛区网络赛1005
- hdu 5883 The Best Path 2016ACM/ICPC青岛赛区网络赛1006
- hdu 5884 Sort 2016ACM/ICPC青岛赛区网络赛1007
- hdu 5889 Barricade 2016ACM/ICPC青岛赛区网络赛1011
- 2016ICPC青岛赛区网络赛 1001
- 2016ICPC青岛赛区网络赛 1002
- 2016ICPC青岛赛区网络赛 1004
- hdu 5883 The Best Path-ICPC网络赛青岛赛区
- hdu 5879 Cure -ICPC网络赛青岛赛区
- 2016 ACM/ICPC 青岛赛区网络赛 I Count Two Three
- 2016 ACM-ICPC 亚洲区(青岛赛区)现场赛
- 2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 HDU 6208 1003 The Dominator of Strings(AC自动机)
- 2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 HDU 6206 1001 Apple(三角形外接圆圆心和半径)
- HDU1874-畅通工程续
- codeforces500A New Year Transportation (水题 模拟)
- Android复习-Java基础(1)
- HDU5900-QSC and Master
- MyBatis获取插入记录的自增长字段值
- hdu 5886 Tower Defence 2016ACM/ICPC青岛赛区网络赛1009
- 决策树与随机森林相关概念
- Leetcode 57 Insert Interval
- 保存Word
- 顺序表(135)
- Android Service与Activity之间通信的几种方式
- Android控件
- 数据库基础——第一天
- Android 四大组件 Service 服务