# DFS# Graph# Traversal

c812 - 1. 觀光景點

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算在一個給定的觀光景點網絡中,與指定景點 v 的相關性至少為 q 的景點數量。網絡由 n 個景點和 n-1 條邊組成,每條邊都有一個相關性值 r。相關性定義為兩個景點之間路徑上最小的相關性值。

解題思路

這題可以使用深度優先搜尋 (DFS) 來解決。首先,將觀光景點網絡表示為一個鄰接表。然後,從起始景點 v 開始進行 DFS,遍歷所有可達的景點。在 DFS 過程中,記錄從起始景點到每個景點的路徑上的最小相關性值。如果這個最小值大於或等於 q,則將該景點計入結果。為了避免重複計算,使用一個 used 陣列來標記已經訪問過的景點。

複雜度分析

  • 時間複雜度: O(N + E),其中 N 是景點數量,E 是邊的數量。在最壞情況下,DFS 需要訪問所有景點和邊。
  • 空間複雜度: O(N),主要用於儲存鄰接表和 used 陣列。

程式碼

#include <iostream>
#include <map>
#include <vector>
using namespace std;
int s,ans,x,y,iv,n,v,q;
bool used[5010];
struct road{
	int rv;
	int g;
};
map <int,vector <road> > p;
void dfs(int no,int mv){
	if(used[no])return;
	used[no]=1;
	if(mv<q)return;
	if(no!=v)++ans;
	for(int i=0;i<p[no].size();++i)
		dfs(p[no][i].g,min(mv,p[no][i].rv));
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n >> v >> q;
	for(int i=0;i<n-1;++i){
		cin >> x >> y >> iv;
		road tmp,tmp2;
		tmp.g=y;
		tmp2.g=x;
		tmp2.rv=tmp.rv=iv;
		p[x].push_back(tmp);
		p[y].push_back(tmp2); 
	}
	for(int i=0;i<p[v].size();++i)
		dfs(p[v][i].g,p[v][i].rv);
	cout << ans << "\n";
}

Discussion