Input
4
1 2
1 3
1 4
Output
1
Hint
-
The only set is {2,3,4}.
-
Please use #pragma comment(linker, “/STACK:16777216”)
Sample Input
4
1 2
1 3
1 4
Sample Output
1
Hint
-
The only set is {2,3,4}.
-
Please use #pragma comment(linker, “/STACK:16777216”)
找三个点不在一条链上。
容斥:三个点组合数-三个点在一条链上
,dfs搜一遍,递归的时候枚举每一个点作为第二个点,所有可能的情况就是上面的所有点×下面的所有点
注意,搜索中son==pre的时候是continue而不是return
#pragma comment(linker, "/STACK:16777216")
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
typedef long long ll;
const int imax=100009;
vector<int> G[imax*2];
ll num[imax];ll sum;ll n;
void dfs1(int now,int pre){
for(int i=0;i<G[now].size();i++){
int u=G[now][i];
if(u==pre) continue;
dfs1(u,now);
num[now]+=num[u];
sum+=ll(n-num[now])*num[u];
}
}
int main(){
while(~scanf("%I64d",&n)){
sum=0;
memset(num,0,sizeof(num));
for(int i=0;i<=n;i++){
G[i].clear();
num[i]=1;
}
for(int i=1;i<n;i++){
int ta,tb;
scanf("%d%d",&ta,&tb);
G[ta].push_back(tb);
G[tb].push_back(ta);
}
dfs1(1,-1);
// cout<<sum<<endl;
ll tem=n*(n-1)*(n-2)/6;
printf("%I64d\n",tem-sum);
}
}