團體程式設計天梯賽-練習集 L2-031 深入虎穴 (25分) dfs深搜+bfs廣搜的兩種思路

Xiu Yan發表於2020-10-15

L2-031 深入虎穴 (25分)

著名的王牌間諜 007 需要執行一次任務,獲取敵方的機密情報。已知情報藏在一個地下迷宮裡,迷宮只有一個入口,裡面有很多條通路,每條路通向一扇門。每一扇門背後或者是一個房間,或者又有很多條路,同樣是每條路通向一扇門…… 他的手裡有一張表格,是其他間諜幫他收集到的情報,他們記下了每扇門的編號,以及這扇門背後的每一條通路所到達的門的編號。007 發現不存在兩條路通向同一扇門。

內線告訴他,情報就藏在迷宮的最深處。但是這個迷宮太大了,他需要你的幫助 —— 請程式設計幫他找出距離入口最遠的那扇門。

輸入格式:
輸入首先在一行中給出正整數 N(<10^​5),是門的數量。最後 N 行,第 i 行(1 ≤ i ≤ N)按以下格式描述編號為 i 的那扇門背後能通向的門:
K D[1] D[2] … D[K]
其中 K 是通道的數量,其後是每扇門的編號。

輸出格式:
在一行中輸出距離入口最遠的那扇門的編號。題目保證這樣的結果是唯一的。

輸入樣例:

13
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

輸出樣例:

12

本題思路:本題實際上就是求樹高,因此有深搜和廣搜兩種方式。
需要特別注意,本題沒有告知入口在哪裡,因此需要找到入口,即找到沒有前驅節點的節點編號。

dfs深搜

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
const int N = 100005;
using namespace std;

int n, k;
int ans, maxn = -1, maxnode = 1;
int vis[N], arr[N];
vector<int> vec[N];//關係樹

void dfs(int root, int len){
	vis[root] = 1;
	if(len>maxn){
		maxn = len;
		maxnode = root;
	}
	for(int i = 0; i < vec[root].size(); i ++){
		if(vis[vec[root][i]]==0)
			dfs(vec[root][i], len+1);
	}
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; i ++){
		cin >> k;
		while(k--){
			cin >> ans;
			arr[ans]++;
			vec[i].push_back(ans);
		}
	}
	for(int i = 1; i <= n; i ++){
		if(arr[i] == 0){
			dfs(i, 1);
			break;
		}
	}
	cout << maxnode << endl;
	
	return 0;
}

bfs廣搜

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
const int N = 100005;
using namespace std;

int n, k, root;
vector<int> vec[N];
queue<int> qu;
int arr[N],deep[N];

void bfs(int root){//返回
	int temp;
	qu.push(root);
	deep[root] = 1;
	while(!qu.empty()){
		temp = qu.front();
		qu.pop();
        for(int i = 0; i < vec[temp].size(); i++){
			qu.push(vec[temp][i]);
		}
	}
	cout << temp << endl;
}

int main(){
	cin >> n;
	for(int i = 1; i <= n; i ++){
		cin >> k;
		while(k--){
			int ans;
			cin >> ans;
			arr[ans] ++;
			vec[i].push_back(ans);
		}
	}

	for(int i = 1; i <= n; i ++){//尋找入口
		if(arr[i] == 0){
			bfs(i);
			break;
		}
	}
	
	return 0;
}

相關文章