電路維修 (廣搜變形 雙端佇列)

2021-09-21 01:10:02 字數 1164 閱讀 9778

題目:

這道題做法挺多的,洛谷上有好多,但是都需要將該迷宮轉換為一張圖,即對於一條邊,其對角線的點相互到達需要幾次旋轉,若該邊為'\',則左上角到右下角可以不用旋轉邊直接到達,而左下角到右上角則需要一次旋轉,故可將該兩點間邊權置為1,將圖建立起來。

接下來可以有兩種做法,堆優化最短路跑,廣搜。

這裡說一下廣搜:

對於普通的廣搜來說,其每一次擴充套件一層的花費都是相同的,即這一層轉移到下一層的花費一定為1,而該題中每一層間的轉移的花費是不一定相同的,因為我們允許某一點到另一點花費為0,轉移代價不同,故無法使用普通的佇列。

這裡需要用到雙端佇列,將擴充套件花費為1的從隊尾入隊,花費為0的從隊頭入隊,這樣每次從隊頭取出乙個元素既滿足了擴充套件層次單調性(非嚴格遞增),也滿足了兩段性(從1或從0而來選取最優)。

既然使用了雙端佇列,那麼就不能像普通的bfs那樣去標記狀態了,看圖:

如圖第一步先將1入隊擴充套件出了四個小步都入隊,像普通的bfs的話此時1,2,3,4,5都應該被標記了,那麼接下來3,4分別出隊,3先出來,那麼先到6,花費為1,6被標記,那麼4就不會再走6了,從1->6最終花費為1,答案顯然是錯的,因為我們可以從1->4->6,花費為0。

因此每次標記時只在擴充套件狀態初進行標記,即第一步只標記了1,後序同理。

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int maxn=509;

bool vis[maxn][maxn];

int dis[maxn][maxn];

vector,int> > v[maxn][maxn];

deque> q;

void init()

}else}}

}printf("no solution\n");

}void jiantu()

else

}}int main()

return 0;

}

跑最短路的做法的話,可以將二維的點壓縮成一維的,跑最短路就ok了。

洛谷2243 電路維修 廣搜 雙端佇列優化

題目描述 題意不太容易說清楚,還是看鏈結吧。題解 首先感覺是廣搜求最短路的題目。我一開始是沒想好怎麼建圖的,感覺直接亂做複雜度好像很 這個題的建圖還是有點巧妙的,建圖方法是把格點看作是圖上的點,原來的斜線看作是兩點間連邊權為0的邊,每個格仔除了原來的斜線的另一條對角線的兩點之間連一條邊權為1的邊,表...

雙端佇列廣搜

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

電路維修 雙端佇列bfs

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