链接:点击打开链接
题意:求一个树上不在一条路径上的三元组的种数
代码:
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long n,dp[100005],vis[100005];
long long ans;
vector<long long> G[100005];
void dfs(long long s){
long long i,tmp,cnt;
cnt=0,vis[s]=1;
for(i=0;i<G[s].size();i++){
tmp=G[s][i];
if(vis[tmp])
continue;
dfs(tmp);
dp[s]+=dp[tmp]; //就是每个节点子节点*剩余节点的
cnt+=dp[tmp];
ans+=dp[tmp]*(n-cnt-1);
}
}
int main(){ //可以求出在一条路径上的,在C(n,3)减去
long long i,j,u,v;
while(scanf("%I64d",&n)!=EOF){
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
dp[i]=1;
G[i].clear();
}
for(i=1;i<n;i++){
scanf("%I64d%I64d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
ans=0;
dfs(1);
printf("%I64d\n",n*(n-1)*(n-2)/6-ans);
}
return 0;
}