L2-031 深入虎穴 (25 分)

如果一个门不是入口,那么一定在其他门后面
所以我们寻找门,只需在所有门后面的门找出没有出现的门即可。如测试数据:
3 2 3 4
2 5 6
1 7
1 8
1 9
0
2 11 10
1 13
0
0
1 12
0
0
粗体为门后的门,对于1-13的门的标号,唯有1没有出现,那么1是根节点(入口)
那么我们BFS,因为结果唯一且不存在2条路通向一个门(DS:树),那么queue中最后一个节点即最远的节点。

#include "bits/stdc++.h"
using namespace std;
vector <int> table[100005];
int vis[100005];
queue<int> que;
int main(){
    
    
	memset(vis, 0, 400020);
	int n, m;
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i){
    
    
		scanf("%d", &m);
		int temp;
		for(int j = 0; j < m; ++j){
    
    
			scanf("%d", &temp);
			table[i].push_back(temp);
			vis[temp] = 1;
		}
	}
	int root;
	for(int i = 1; i <= n; ++i){
    
    
		if(0 == vis[i]) {
    
    
			root = i;
			break;
		}
	}
	que.push(root);
	int ans = root;
	while(!que.empty()){
    
    
		int p = que.front();
		que.pop();
		int len = table[p].size();
		for(int i = 0; i < len; ++i) que.push(table[p][i]);
		ans = p;//每次更新ans,ans为最后(远)的节点
	}
	printf("%d\n", ans);
}

猜你喜欢

转载自blog.csdn.net/qq_33987764/article/details/113690584