import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main();
}
ArrayList<ArrayList<Integer>>a=new ArrayList<>();
ArrayList<Integer>b=new ArrayList<>();
int cn[],n;
boolean vis[];
void dfs(int po,int cnt) {
vis[po]=true;
if((cnt&1)==1)b.add(po);
for (int i : a.get(po))
if(!vis[i]) {
vis[i]=true;
dfs(i,cnt+1);
}
return;
}
public Main() {
Scanner in=new Scanner(System.in);
n=in.nextInt();cn=new int[n+1];vis=new boolean[n+1];
for (int i = 0; i <=n; i++)
a.add(new ArrayList<Integer>());
for (int i = 0; i <n-1; i++) {
int m=in.nextInt(),k=in.nextInt();
cn[m]++;cn[k]++;
a.get(m).add(k);a.get(k).add(m);
}
dfs(1,1);
long res=0;
for (int i : b)
res+=n-b.size()-cn[i];
System.out.println(res);
}
}
思路:将已给的树,用dfs算法分成二分图的两个子集,当一个子集里的每个点与另一个子集里的店全部连接时达最多边
编码技巧:利用ArrayList实现图的领接表