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

2021-08-26 18:11:16 字數 1050 閱讀 7773

題目描述

題意不太容易說清楚,還是看鏈結吧。

題解:

首先感覺是廣搜求最短路的題目。我一開始是沒想好怎麼建圖的,感覺直接亂做複雜度好像很**。這個題的建圖還是有點巧妙的,建圖方法是把格點看作是圖上的點,原來的斜線看作是兩點間連邊權為0的邊,每個格仔除了原來的斜線的另一條對角線的兩點之間連一條邊權為1的邊,表示需要進行一次旋轉。

建好圖之後可以開始bfs了,但是這樣的複雜度不夠優秀,我們使用了雙端佇列來代替原來廣搜的佇列,邊權為0的邊到達的點插入隊首,邊權為1的點到達的點插入隊尾,這樣保證了每個點被遍歷到的次數是o(1)級別的,最後總複雜度便是o(r*c*t)的了。

**:

#include 

using namespace std;

int t,r,c,hed[600010],cnt,q[600010],h,t,inq[500010],dis[500010];

char s[510][510];

struct node

a[2000010];

inline void add(int from,int to,int dis)

int main()

cnt=0;

memset(hed,0,sizeof(hed));

for(int i=1;i<=r;++i)

else}}

h=501

*501+2;

t=h;

q[h]=1;

memset(inq,0,sizeof(inq));

memset(dis,0x3f,sizeof(dis));

dis[1]=0;

inq[1]=1;

while(h<=t)

else

}}

}++h;

}if(dis[(r+1)*(c+1)]<=1e6)

printf("%d\n",dis[(r+1)*(c+1)]);

else

printf("no solution\n");

}return

0;}

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

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

洛谷P2243 電路維修

題目位址 轉化為圖論問題 對於每個交叉點 x,y 抽象成節點。與它相鄰的四個點中,可以直接連線的邊權為0,否則邊權為1。用死了的 spfa解決圖論問題。include include define gc getchar define clean x,k memset x,k,sizeof x def...

雙端佇列廣搜

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