# DFS# Graph# Connectivity

a290 - 新手訓練系列 ~ 圖論

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定有向圖中,從起點城市 A 是否能到達終點城市 B。輸入包含城市數量 N、道路數量 M,以及 M 條有向邊。最後輸入起點 A 和終點 B,輸出 "Yes!!!" 如果 A 能到達 B,否則輸出 "No!!!"。

解題思路

本題可以使用深度優先搜尋 (DFS) 演算法來解決。首先,建立一個鄰接表來表示圖。然後,從起點 A 開始進行 DFS,遍歷所有可到達的城市。如果在 DFS 過程中到達了終點 B,則輸出 "Yes!!!",否則輸出 "No!!!"。

複雜度分析

  • 時間複雜度: O(N + M) (DFS 遍歷圖的頂點和邊)
  • 空間複雜度: O(N) (鄰接表和訪問陣列)

程式碼

#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> v;
vector<bool> vis;
void dfs(int from){
	vis[from]=1;
	for(auto i:v[from])
		if(!vis[i]) dfs(i);
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n,m,a,b;
	while(cin >> n >> m){
		v.resize(n+1);
		vis.assign(n+1, false);
		while(m--){
			cin >> a >> b;
			v[a].push_back(b);
		}
		cin >> a >> b;
		dfs(a);
		(vis[b]==0)?cout << "No!!!\n":cout << "Yes!!!\n";
		v.clear();
		vis.clear();
	}
}

Discussion