1. 程式人生 > >HDU - 4705

HDU - 4705

題解:求出在一條線的三個點,然後全部的三種情況減去就可以了,怎麼會出現在一條線呢,假設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;
}