Mahmoud and Ehab continue their adventures! As everybody in the evil land knows, Dr. Evil likes bipartite graphs, especially trees.
2 sets in such a way, that for each edge (u, v) that belongs to the graph, u and v
n
A cycle and a loop aren't the same
Input
n — the number of nodes in the tree (1 ≤ n ≤ 105).
n - 1 lines contain integers u and v (1 ≤ u, v ≤ n, u ≠ v) — the description of the edges of the tree.
It's guaranteed that the given graph is a tree.
Output
Output one integer — the maximum number of edges that Mahmoud and Ehab can add to the tree while fulfilling the conditions.
Examples
input
3
1 2
1 3
output
0
input
5
1 2
2 3
3 4
4 5
output
2
题目大概:
有一颗二分树,给出一些边,问可以添加的最大变的数量。
思路:
二分图的最大匹配问题,分为两个集合x y,集合内的边不会相连,两集合的最大边数是 x内点的数量*y内点的数量。已经给出了n-1,所以最大边数是 x内点的数量*y内点的数量-n+1.
这个类型的题,我记得前几次网络赛中遇见过,那一个题没有拐弯抹角,直接就明说了两个集合,两个集合可以相互连边,具体的忘了,能够找到规律。
代码:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int>a[100005];
long long b[2];
int dfs(int poin,int rpoin,int co)
{
b[co]++;
for(int i=0;i<a[poin].size();i++)
{
if(a[poin][i]!=rpoin)
dfs(a[poin][i],poin,!co);
}
return 0;
}
int main()
{
long long n;
scanf("%I64d",&n);
for(int i=1;i<n;i++)
{
int q,w;
scanf("%d%d",&q,&w);
a[q].push_back(w);
a[w].push_back(q);
}
dfs(1,0,0);
printf("%I64d\n",b[0]*b[1]-n+1);
return 0;
}