P2243 電路維修

2022-03-04 05:10:29 字數 1870 閱讀 5315

elf 是來自gliese 星球的少女,由於偶然的原因漂流到了地球上。在她無依無靠的時候,善良的運輸隊員mark 和james 收留了她。elf 很感謝mark和james,可是一直也沒能給他們幫上什麼忙。

有一天 mark 和james 的飛行車沒有辦法啟動了,經過檢查發現原來是電路板的故障。飛行車的電路板設計很奇葩,如下圖所示:

輸入格式:

輸入檔案包含多組測試資料。第一行包含乙個整數t 表示測試資料的數目。

對於每組測試資料,第一行包含正整數 r 和c,表示電路板的行數和列數。

之後 r 行,每行c 個字元,字元是"/"和"\"中的乙個,表示標準件的方向。

對於40% 的資料,r,c≤5。

對於 100% 的資料,r,c≤500,t≤5。

輸出格式:

對於每組測試資料,在單獨的一行輸出乙個正整數,表示所需的縮小旋轉次數。

如果無論怎樣都不能使得電源和發動機之間連通,輸出 no solution。

輸入樣例#1: 

1

3 5\\/\\

\\///

/\\\\

輸出樣例#1: 

1
樣例的輸入對應於題目描述中的情況。

只需要按照下面的方式旋轉標準件,就可以使得電源和發動機之間連通。

很久以前的一道題,卡spfa求最短路。

直接把座標變為點,對於需要旋轉才能連通的對角線連邊權為$1$的邊,不用旋轉的對角線連邊權為$0$的邊,然後只要跑最短路,由於是個稠密圖,於是我們跑堆優化的djikstra就好了。

**:

#include#include

#include

#define ll long long

#define il inline

#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

#define debug printf("%d %s\n",__line__,__function__)

using

namespace

std;

using

namespace

__gnu_pbds;

const

int inf=520,n=1000005

;int t,r,c,h[300005],cnt,dis[300505

],to[n],val[n],net[n];

char s[505

];struct

node

bool

operator

};typedef __gnu_pbds::priority_queue

,pairing_heap_tag>heap;

heap q;

heap::point_iterator id[n];

il void add(int u,int v,int

w)il

void

spfa()

}dis[r*c]==dis[0]?puts("

no solution

"):printf("

%d\n

",dis[r*c]);

}int

main()

else }}

spfa();

}return0;

}

P2243 電路維修

看了眼題解,貌似沒有和我的思路一樣的 所以就來寫一篇題解 首先我不會什麼雙向bfs也懶得寫最短路 所以,就乙個bfs 闖遍天下 先看題 感性理解一下 貌似如 1,2 2,1 1,4 4,1 都到不了 雖然這個麼什麼用 好了,進入主題 首先,bfs是乙個佇列,為了保證結果的真確性,所以存當前花費的陣列...

洛谷P2243 電路維修

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

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

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