3369. 三千米健身步道

单点时限: 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/105914578