記事ディレクトリ
1. タイトル
ノード間のパス。有向グラフが与えられた場合、2 つのノード間にパスが存在するかどうかを見つけるアルゴリズムを設計します。
例 1:
入力: n = 3、グラフ = [[0, 1], [0, 2], [1, 2], [1, 2]]、開始 = 0、ターゲット = 2 出力
: true
例 2:
入力: n = 5、グラフ = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4] 、[1, 3]、[2, 3]、[3, 4]]、開始 = 0、ターゲット = 4
出力: true
ヒント:
- ノード数 n の範囲は [0, 10 5 ] です。
- ノード番号は 0 以上、n 未満です。
- グラフ内に自己ループや平行エッジが存在する場合があります。
2. C# の問題の解決策
BFS メソッドを使用してパスを検索します。コードは次のとおりです。
public class Solution {
public bool FindWhetherExistsPath(int n, int[][] graph, int start, int target) {
// 建立邻接表
Dictionary<int, List<int>> dic = new Dictionary<int, List<int>>();
for (int i = 0; i < graph.Length; i++) {
int p = graph[i][0], q = graph[i][1];
if (dic.ContainsKey(p) && !dic[p].Contains(q)) dic[p].Add(q);
else dic[p] = new List<int> {
q};
}
// BFS
Queue<int> queue = new Queue<int>();
queue.Enqueue(start);
do {
int node = queue.Dequeue(); // 取出结点
if (node == target) return true; // 判断是否为目标对象
if (!dic.ContainsKey(node)) continue; // 如果邻接表不存在该结点,则直接跳过
for (int i = 0; i < dic[node].Count; i++) // 遍历邻接表,继续找后续节点
queue.Enqueue(dic[node][i]);
dic.Remove(node); // 访问过该结点,因此从邻接表中删除记录
} while (queue.Count != 0);
return false;
}
}
- 時間計算量: O ( n + e ) O(n+e)O ( n+e),其中 e e eは有向グラフのエッジの数です。
- 空間計算量: O ( n ) O(n)O ( n )。