这题解法很简单,但思路很难想
对这种题,其实考虑枚举最大值,然后最大值链配对即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5;
int n,cnt=0,head[N];
struct edge{
int link,v;
}q[N<<1];
void put(int u,int v){
q[++cnt].v=v;
q[cnt].link=head[u];
head[u]=cnt;
}
ll ans=0;
ll dp[N];
void dfs(int x){
ll tmp=0;
for(int i=head[x];i;i=q[i].link){
int v=q[i].v;
dp[x]+=(dp[v]+1);
tmp+=(dp[v]+1)*(dp[v]+1);
}
ans+=dp[x]*dp[x]-tmp;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u>v)put(u,v);
else put(v,u);
}
for(int i=2;i<=n;i++){
dfs(i);
}
printf("%lld",ans);
}
这篇博客介绍了一种利用图论方法解决链匹配问题的算法。通过枚举最大值并进行链配对,可以有效地计算出答案。博主分享了C++实现的代码,展示了如何在复杂度为O(n^2)的时间内完成这个任务。算法虽然简单,但思路颇具挑战性。

1223

被折叠的 条评论
为什么被折叠?



