[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;
}

浙公网安备 33010602011771号