题目描述
B市的地图是一棵有nn个节点的树,每个节点上都有房子出售。小棕和小绿是一对好朋友,他们近期都准备在B市买房。为了方便周末一起玩,小绿希望他的房子一定不要离小棕的太远。不过为了给小棕一个惊喜,小绿没有去找小棕问他买在哪里,他希望能直接在图上找到一些点,这些点满足距离其他任意点的距离都不超过2。这样只要他这这些点上买房,那么无论小棕的房子在哪里,他们之间的距离都不会超过2了。
现在小绿来求助于你,而你只需要告诉他有多少个满足他要求的点就行。
存图方式:用一个二维vector数组来存放每一个点连接的别的点,用一维存图可能会混乱,我们直接用二维来存图
满足条件
1.和当前点连着的条数
2.和当前点连着点连接的点的条数
两者的和加起来如果等于n-1
那么就说明这个点能够在2的距离内把所有的点都连上,如果实在不理解,可以把我注释掉的内容恢复然后直接输入看看寻找的过程,这样就会好懂一些.
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int n, ans;
vector<int>g[2000005];
//注意这是二维图,一维的是g(),二维是g[]
int main()
{cin >> n;for (int i = 1; i < n; i++){int a, b;cin >> a >> b;g[a].push_back(b);//存图g[b].push_back(a);}for (int i = 1; i <= n; i++){int sum = 0;//记录边数for (auto x : g[i]){sum += g[x].size();//size表示连接条数//cout << "x=" << x << endl;//cout << "x.sum"<<sum << endl;}if (sum == n - 1)ans++;//答案数++//cout << endl;}cout << ans;return 0;
}