单点时限: 2.0 sec
内存限制: 256 MB
华师大是一个巨大的学校,众所周知,华师大的地图是一棵树,有 座教学楼,这些教学楼之间由 条道路相连,每条道路的长度都是一千米。
现在华师大投资建设一个「三千米健身步道」。为了让同学们不带喘气的跑(走)完这个健身步道,这个健身步道必须有一个起点,一个终点,中间是一段连续的三千米的跑道。华师大决定利用现有的 条道路建设这一个健身步道。问总共有多少种方案?
注意,起点和终点交换算同一种方案。
输入格式
第一行为 ,表示教学楼数量,教学楼编号从 到 。
接下来 行,每行为 ,表示 之间有道路相连。
输出格式
输出方案数。如果不存在,输出 。
样例
input
6
1 2
2 3
3 4
4 5
4 6
output
3
/*
思路一:DFS深搜,最终结果要除以二
*/
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>v[1001];
int ans=0;
bool visit[1001]= {false};
void dfs(int index,int dept) {
if(dept==3) {
ans++;
return;
}
visit[index]=true;
for(int i = 0; i < v[index].size(); i++) {
if(visit[v[index][i]]==false) {
visit[v[index][i]]=true;
dfs(v[index][i],dept+1);
visit[v[index][i]]=false;
}
}
visit[index]=false;
}
int main() {
int n;
cin>>n;
for(int i = 0; i < n - 1; i++) {
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i =1; i <= n; i++) {
dfs(i,0);
}
cout<<ans/2;
return 0;
}
/*
思路二:用Floyd算法求所有距离之和为3的个数
*/
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
cin>>n;
int a[n+1][n+1];
fill(a[0],a[0]+(n+1)*(n+1),n);
for(int i = 0; i < n-1; i++) {
int x,y;
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
for(int k = 1; k <= n; k++) {
for(int i = 1; i <= n; i++) {
for(int j=1; j <= n; j++) {
if(a[i][k]!=n&&a[k][j]!=n&&a[i][k]+a[k][j]<a[i][j]) {
a[i][j]=a[i][k]+a[j][k];
}
}
}
}
int ans=0;
for(int i = 1; i <= n; i++) {
for(int j = i+1; j <= n; j++) {
if(a[i][j]==3)
ans++;
}
}
cout<<ans<<endl;
return 0;
}