[POI2014]Hotel题解

Description

有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达。吉丽要给他的三个妹子各开(一个)房(间)。三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽满意,你需要让三个房间两两距离相同。
有多少种方案能让吉丽满意?

Input Format

第一行一个数n。
接下来n-1行,每行两个数x,y,表示x和y之间有一条边相连。

Output Format

让吉丽满意的方案数。

输入数据 1

7
1 2
5 7
2 5
2 3
5 6
4 5

Copy

输出数据 1

5

Copy

Hint

【样例解释】
{1,3,5},{2,4,6},{2,4,7},{2,6,7},{4,6,7}


【数据范围】
n≤5000

Source

By Dzy

思路

BFS即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,m,a,b,f[5005][5005],f2[5005],hj,ck=0,rt=0;
vector<long long> v[5005];
void abc(long long a1,long long fa,long long s,long long zf){
	hj=max(hj,s);
	if(fa==0){
		for(int i=0;i<v[a1].size();i++){
			long long tt=v[a1][i];
			if(tt!=fa){
				abc(tt,a1,s+1,tt);
			}
		}
	}
	else{
		f[zf][s]++;
		f2[s]++;
		for(int i=0;i<v[a1].size();i++){
			long long tt=v[a1][i];
			if(tt!=fa){
				abc(tt,a1,s+1,zf);
			}
		}		
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n-1;i++){
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	for(int i=1;i<=n;i++){
		hj=1;
		abc(i,0,1,0);
		for(int o=2;o<=hj;o++){
			rt=0;
			for(int j=0;j<v[i].size();j++){
				ck+=f[v[i][j]][o]*(f2[o]-f[v[i][j]][o])*(f2[o]-f[v[i][j]][o]);	//-f[v[i][k]][o]		
				rt+=f[v[i][j]][o]*f[v[i][j]][o];
			}		
			for(int j=0;j<v[i].size();j++){
				ck-=f[v[i][j]][o]*(rt-f[v[i][j]][o]*f[v[i][j]][o]);	//-f[v[i][k]][o]					
			}		
		}
		for(int o=2;o<=hj;o++){
			f2[o]=0;
			for(int j=0;j<v[i].size();j++){
				f[v[i][j]][o]=0;			
			}
		}
	}
	cout<<ck/6<<endl;
	return 0;
}

posted @ 2025-10-24 20:41  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源