题目给出一棵树,求在使这个图依然是二分图的前提下,最多能添加多少条边。
题解:
树必然是二分图,一定有n-1条边,我们先dfs对其二分染色,把点分为两个集合,两集合大小的积|s1|*|s2|就是最多能有的边数,减去原边数就是答案了。
AC代码:
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
vector <int> v[100009];
int color[100009];
int vis[100009],n;
void dfs(int x,int c)
{
color[x]=c;
vis[x]=1;
for(int i=0;i<v[x].size();i++)
{
if(!vis[v[x][i]])
{
dfs(v[x][i],!c);
}
}
return ;
}
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
int t1,t2;
cin>>t1>>t2;
v[t1].push_back(t2);
v[t2].push_back(t1);
}
dfs(1,1);
//for(int i=1;i<=n;i++)cout<<color[i]<<endl;
long long int cnt=0,ans=0;
for(int i=1;i<=n;i++)if(color[i]==1)
{
cnt++;
}
ans=cnt*(n-cnt)-(n-1);
cout<<ans<<endl;
}