#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#include<iomanip>
#include<queue>
#include<bitset>
#include<cstdlib>
#include<cstdio>
#include<sstream>
#include<stack>
using namespace std;
const int maxn = 105;
int n;
vector<int> v[maxn];
bool vis[105] = { 0 };
bool bfs(int d) {
queue<int> q;
q.push(d);
int k = 1;
vis[d] = 1;
while (!q.empty()) {
int a = q.front();
q.pop();
for (auto x : v[a]) {
if (!vis[x]) {
q.push(x);
k++;
}
}
}
return k == n;
}
void work() {
cin >> n;
for (int i = 2; i <= n; i++) {
int ix, iy;
cin >> ix >> iy;
v[iy].push_back(ix);
}
bool sign = false;
for (int i = 1; i <= n; i++) {
memset(vis, false, sizeof vis);
if (bfs(i)) {
cout << i;
sign = true;
break;
}
}
if (!sign)cout << -1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int testcase = 1;
while (testcase--) {
work();
}
return 0;
}
我们利用vector容器记录一个点可以作为哪些点的“头”,然后就从最小的点开始暴力bfs,在bfs之前,初始化一下vis数组用以记录每个点有没有被放入过。在bfs过程中,我们每次取队列的第一个元素(队列不为空),然后将以第一个元素为“头”的且没有放入过队列的元素入队,记录最后入队次数是否等于n,如果等于,直接输出即可。
682

被折叠的 条评论
为什么被折叠?



