對應:
0 —— 1 —— 2
+1 -1 +1
如果變成三角形:
0 —— 1
\ /
2
先分:
0 = +1
1 = -1
2 = +1
但 0 和 2 又有一條邊:
0 —— 2
+1 +1
相連兩點同隊,衝突:
return false
沒分組 → 放相反隊;已分組但跟 cur 同隊 → false。
component 不是單一節點,而是 Connected Component(連通元件)=彼此有路可以連到的一整群節點。
最小例子:
0 — 1 — 2 3 — 4
這裡有 2 個 component:
Component 1:0,1,2
Component 2:3,4
DFS 從 0 會一路走完整個 0,1,2;但走不到 3,4,所以外面的 for 還要再找到 3,重新開始一次 DFS。
所以不是「走到最深處就全部完成」,而是:每一群都要檢查;每群內 DFS 走到底。
graph vector<vector> 每個節點連到哪些節點
group vector 每個節點目前在哪一隊
最小例子:
graph = {
{1}, // 0 連 1
{0, 2}, // 1 連 0、2
{1} // 2 連 1
};
所以 graph 必須二維。但:group = {1, -1, 1};每個節點只需要一個隊伍數字,所以一維就夠。
if (group[next] == 0)因為要問:next 這個節點有沒有被分隊?
group[next] 就是「next 的隊伍」。
例如:group = {1, -1, 0};
group[0] = 1
group[1] = -1
group[2] = 0 ← 還沒分組
group[next] = -group[cur];
group[cur] = 1
-group[cur] = -1所以 next 自動變另一隊。vice versa永遠自動切到相反隊。
不能:group[next] = -1;因為 cur 有可能本來就是 -1,那 next 就應該是 +1。
-group[cur] = 永遠取目前隊伍的相反值。
6.不是「兩個 group」:
if (!dfs(graph, group, next))
這三個是傳給 DFS 的三個資料:整張圖, 每個節點的隊伍, 接下來從哪個節點繼續
而 dfs(...) 本身會回傳:true = 這一路分隊沒有衝突false = A-A 或 B-B 衝突
if (!dfs(...))如果下一層 DFS 回傳 false → 我也立刻 return false。
真正比較 A/B 是否衝突else if (group[next] == group[cur])
7.:
vector group(n, 0);建立一個長度為 n 的 vector,每一格初始值都是 0。
n = 4;group = {0, 0, 0, 0}
4 個節點,一開始全部未分組。
graph = 誰跟誰相連
group = 每個人在哪隊