思路: 對於每一條邊,我們如果想要使得他發揮最大價值,其實就是這條邊被用了 min(sonsz[ u ], sonsz[ v ])次,那麼我如果找到乙個點使得刪掉這個點之後所有的聯通分支的點的個數都小於等於n/2個點,那麼就可以構造出一種方案使得每條邊被使用min(sonsz[ u ], sonsz[ v ])次。所以就是找樹的重心就可以了。
**:
#includeusing namespace std;
typedef long long ll;
typedef pairpil;
const int n =1e5+5;
const int inf =0x3f3f3f3f;
int sz[n];
vector< pil >ve[n];
int n;
ll ans;
int zx;
int mn;
void dfs1(int u,int fa)
tmp=max(tmp,n-sz[u]-1);
if(tmp}void dfs2(int u,int fa,ll dis)
}void init()
int main()
mn=inf;
dfs1(1,1);
ans=0;
//printf("zx %d\n",zx);
dfs2(zx,zx,0);
printf("case #%d: %lld\n",++kk,ans*2);
}return 0;
}
51nod 1737 樹的重心
思路 樹的重心也叫樹的質心。找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡。考慮每一條邊被統計進答案幾次,若斷開這條邊後樹形成大小為s1 s2的兩個聯通塊則這條邊最多被統計min s1,s2 次。刪去重心後任意同一聯通塊中的兩點不構成路...
51 nod 1737 配對 貢獻
1737 配對 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 給出一棵n個點的樹,將這n個點兩兩配對,求所有可行的方案中配對兩點間的距離的總和最大為多少。input 乙個數n 1 n 100,000,n保證為偶數 接下來n 1行每行三個數x,y,z表示有一條長度...
51nod 配對(求樹的重心)
傳送門 給出一棵n個點的樹,將這n個點兩兩配對,求所有可行的方案中配對兩點間的距離的總和最大為多少。input 乙個數n 1 n 100,000,n保證為偶數 接下來n 1行每行三個數x,y,z表示有一條長度為z的邊連線x和y 0 z 1,000,000,000 output 乙個數表示答案inpu...