hdoj4705Y【树形dp+简单组合数学】

来源:互联网 发布:java concurrent i自增 编辑:程序博客网 时间:2024/06/07 02:28



Y

Time 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
41 21 31 4
 

Sample Output
1
Hint
1. The only set is {2,3,4}.2. Please use #pragma comment(linker, "/STACK:16777216")
 

Source
2013 Multi-University Training Contest 10
 

题意在一棵树上选三个节点没有一条路径相连;

先求出在一条路径上的种类数用总数减去即可;

#include<cstdio>#include<cstdlib>#include<cstring>#include<vector>#include<algorithm>#define MAX 100005#define LL long longusing 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;} 


0 0
原创粉丝点击