1 /* 2 題目大意:給一棵n個節點的樹,求任意三個點兩兩無直系親屬關係的種數。 3 能夠求反方向的,對於每一個節點i使他選,他的一個子樹中選一個,再在剩餘的任意選一個。 4 */ 5 #pragma comment(linker, "/STACK:16777216") 6 #include <iostream> 7 #include <cstdio> 8 #include <cstring> 9 #include <vector> 10 using namespace std; 11 12 const int maxn=100005; 13 typedef __int64 LL; 14 int num[maxn],n;LL ans; 15 vector<int>f[maxn]; 16 17 void dfs(int u,int pre) 18 { 19 num[u]=1; 20 for(int i=0;i<f[u].size();i++) 21 { 22 int v=f[u][i]; 23 if(v==pre) continue; 24 dfs(v,u); 25 num[u]+=num[v]; 26 ans+=(LL)num[v]*(n-num[u]); 27 } 28 return ; 29 } 30 int main() 31 { 32 int i,a,b; 33 while(~scanf("%d",&n)) 34 { 35 for(i=1;i<=n;i++) f[i].clear(); 36 for(i=1;i<n;i++) 37 { 38 scanf("%d%d",&a,&b); 39 f[a].push_back(b); 40 f[b].push_back(a); 41 } 42 memset(num,0,sizeof(num)); 43 ans=0; 44 dfs(1,-1); 45 printf("%I64d\n",(LL)n*(n-1)*(n-2)/6-ans); 46 } 47 return 0; 48 }