AcWing 175 電路維修(雙端佇列BFS)

2021-10-04 09:07:46 字數 1842 閱讀 9442

我們可以把電路板上的每個格點(橫線與豎線的交叉點)看作無向圖中的節點。若兩個節點 x

xx 和 y

yy 是某個小方格的兩個對角,則在 x

xx 與 y

yy 之間連邊。若該方格中的標準件(對角線)與 x

xx 到 y

yy 的線段重合,則邊權為 0

00;若垂直相交,則邊權為 1

11(說明需要旋轉 1

11 次才能連上)。然後,我們在這個無向圖中求出左上角到右下角的最短距離,就得到了答案。

這是一張邊權要麼是 0、要麼是 1的無向圖。在這樣的圖上,我們可以通過雙端佇列廣搜來計算。演算法的整體框架與一般的廣搜類似,只是在每個節點上沿分支擴充套件時稍作改變。如果這條分支是邊權為0的邊,就把沿該分支到達的新節點從隊頭入隊;如果這條分支是邊權為 1的邊,就像一般的廣搜一樣從隊尾入隊。這樣一來,我們就仍然能保證,任意時刻廣搜佇列中的節點對應的距離值都具有「兩段性」和「單調性」,每個節點第一次被訪問時,就能得到從左上角到該節點的最短距離。

因為每個節點只需要訪問一次,所以演算法的時間複雜度為 o(r

∗c)o(r*c)

o(r∗c)

。本題還有乙個性質,其實網格格點有一半是永遠走不到的(如下圖紅色的點),所以可以特判一下。

細節處理:每個格仔的編號和每個格點的編號不一樣,注意兩對增量陣列的寫法。

;// 當前格點四周的新格點

int dy=

;int ix=

;// 當前格點四周的格仔

int iy=

;char cs[5]

="\\/\\/"

;int n, m;

char g[n]

[n];

int d[n]

[n];

bool st[n]

[n];

// 儲存每個點的最短路是否已經確定

intbfs()

);d[0]

[0]=

0;while

(q.size()

));else q.

push_front()

;}}}

return-1

;// 不會被執行到

}int

main()

return0;

}

AcWing 175 電路維修

達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是乙個 r 行 c 列的網格 r,c 500 如下圖所示。每個格點都是電線的接點,每個格仔都包含乙個電子元件。電子...

175 電路維修 bfs

達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是乙個r行c列的網格 r,c 500 如下圖所示。電路.png 每個格點都是電線的接點,每個格仔都包含乙個電子元件...

電路維修 雙端佇列bfs

傳送門 洛谷p2243 初步判斷,是道最短路的題.首先就是建圖了,對於電路板上的每一對角線,令與讀入方向相同的路徑邊權為0,方向相反的邊權為1.由於只能走斜線,根據網格圖的性質可知橫縱座標之和為奇數的點是到不了的,預設起點為 0,0 0,0 0,0 對此,可以去掉一半的邊 根本就到不了 同時也可以直...