HDU - 4705
阿新 • • 發佈:2018-11-20
題解:求出在一條線的三個點,然後全部的三種情況減去就可以了,怎麼會出現在一條線呢,假設A節點必選,那麼對於某一分支選一個,其他所有點選一個,意思就是列舉一條線中 三個點的中點 兩邊分別選一個就可以了。不要用 lld,用 I64d 前幾天交上之後不能判,信心滿滿會過,就沒管,今天看沒過的題發現有他.....
#include<iostream> #include<cstdio> #include<vector> using namespace std; const int N=1e5+10; typedef long long ll; int n,son[N]; ll C[N][5],ans; vector<int> v[N]; void init() { C[0][0]=C[1][0]=C[1][1]=1; for(int i=2;i<=1e5;i++) { C[i][0]=1; for(int j=1;j<=3;j++) C[i][j]=C[i-1][j]+C[i-1][j-1]; } } void dfs(int fa,int u) { son[u]=1; for(int i=0;i<v[u].size();i++) { int to=v[u][i]; if(to==fa) continue; dfs(u,to); son[u]+=son[to]; ans+=(ll)(n-son[u])*son[to]; } } int main() { init(); int x,y; while(~scanf("%d",&n)) { ans=0; for(int i=1;i<=n;i++) v[i].clear(); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } dfs(0,1); printf("%I64d\n",C[n][3]-ans); } return 0; }