iT邦幫忙

2026 iThome 鐵人賽

DAY 9
1
Software Development

快樂演算法系列 第 9

preprocessing fix the logic + gaiconf & 785 v2

  • 分享至 

  • xImage
  •  
  1. example
    開始

    0 還沒分組

    0 = +1

    0 連到 1

    1 還沒分組

    1 = -1

    1 連到 2

    2 還沒分組

    2 = +1

    繼續 DFS

對應:

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 = 每個人在哪隊


上一篇
label桌機GPU97%學太多sample下修、標記範圍小一點 & 785 v1
下一篇
木頭機321GO還需要多練習 &785 v3 變數名稱update
系列文
快樂演算法13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
AndyAWD
iT邦新手 1 級 ‧ 2026-08-28 23:32:14

太神了!

我要留言

立即登入留言