YTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2349 Accepted Submission(s): 627
Problem Description
Sample Input
Sample Output
Source
|
题意在一棵树上选三个节点没有一条路径相连;
先求出在一条路径上的种类数用总数减去即可;
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<algorithm>
#define MAX 100005
#define LL long long
using namespace std;
vector<int>vec[MAX];
int father[MAX],son[MAX];
int dfs(int node,int pre){
son[node]=1;
father[node]=pre;
for(int i=0;i<vec[node].size();++i){
int u=vec[node][i];
if(u!=pre)
son[node]+=dfs(u,node);
}
return son[node];
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF){
for(i=0;i<=n;++i)vec[i].clear();
for(i=0;i<n-1;++i){
int a,b;
scanf("%d%d",&a,&b);
vec[a].push_back(b);
vec[b].push_back(a);
}
dfs(1,-1);
LL ans=0,LT,m;
for(i=1;i<=n;++i){
LT=0;
for(j=0;j<vec[i].size();++j){
int u=vec[i][j];
if(u==father[i])
m=n-son[i];
else
m=son[u];
LT+=m*(n-m-1);
}
ans+=LT;
}
printf("%lld\n",(LL)n*(n-1)*(n-2)/6-ans/2);
}
return 0;
}