题意
给你一个二分图的树(无环联通图),求最多能添加多少边,使其还是二分图。
解析
假设集合 x , y x,y x,y两个集合之间最大的边是 x ∗ y x*y x∗y,所以我们只要找出原二分图的两个集合的大小,答案就是 x ∗ y − ( n − 1 ) x*y-(n-1) x∗y−(n−1),二分图的大小用染色dfs解决一下即可。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int e[N],ne[N],h[N],idx;
int color[N];
ll x,y;
void dfs(int i,int c){
if(c==1)x++;
else y++;
color[i]=c;
for(int u=h[i];u!=-1;u=ne[u]){
int v=e[u];
if(!color[v])
dfs(v,3-c);
}
}
void add(int u ,int v){
e[idx]=v,ne[idx]=h[u],h[u]=idx++;
}
int main() {
int n ;
cout<<INT_MAX<<endl;
memset(h,-1,sizeof h);
cin>>n;
for(int i=1;i<n;++i){
int u,v;
cin>>u>>v;
add(u,v),add(v,u);
}
dfs(1,1);
cout<<x*y-n+1;
}