並查集 DFS 搭橋

2022-05-03 16:27:09 字數 1833 閱讀 2222

[codevs1002]搭橋

description

有一矩形區域的城市中建築了若干建築物,如果某兩個單元格有乙個點相聯絡,則它們屬於同一座建築物。現在想在這些建築物之間搭建一些橋梁,其中橋梁只能沿著矩形的方格的邊沿搭建,如下圖城市1有5棟建築物,可以搭建4座橋將建築物聯絡起來。城市2有兩座建築物,但不能搭建橋梁將它們連線。城市3只有一座建築物,城市4有3座建築物,可以搭建一座橋梁聯絡兩棟建築物,但不能與第三座建築物聯絡在一起。

input description

在輸入的資料中的第一行包含描述城市的兩個整數r 和c, 分別代表從北到南、從東到西的城市大小(1 <= r 

<= 50 and 1 <= c

<= 50). 接下來的r 行, 每一行由c 個(「#」)和(「.」)組成的字元. 每乙個字元表示乙個單元格。「#」表示建築物,「.」表示空地。

output description

在輸出的資料中有兩行,第一行表示建築物的數目。第二行輸出橋的數目和所有橋的總長度。

sample input

樣例1

3 5樣例2

3 5樣例3

3 5樣例4:

3 5sample output

樣例1

4 4樣例2

0 0樣例3

0 0樣例4

1 1試題分析:這個題我一開始看分類是搜尋,並沒有想到並查集……後來看了眼黃學長的部落格,恍然大悟tat

標程就是dfs+並查集

①用dfs聯通塊求第一問,然後把塊標號

②列舉塊的延伸,建立橋,排序路徑長度(如圖)

顯然,在乙個方格的一點,如果他向上延伸但是上面有塊與他乙個聯通塊,那麼他就可以捨去

③merge並統計答案

**

#include#include#include#include#include#include#include//#includeusing namespace std;

const int inf = 9999999;

#define ll long long

inline int read()

int n,m;

int map[101][101];

char c;

int cnt;

int vis[52][52];

int dfsans1(int a,int b)

int temp;

struct dataa[100001];

int fa[1001];

bool cmp(data a,data b)

} }sort(a+1,a+1+temp,cmp);

int ans=0,tmp=0;

init();

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

} printf("%d %d\n",tmp,ans);

}int main()

} for(int i=1;i<=n;i++)

} printf("%d\n",cnt);

if(cnt==0)

ga();

return 0;

}

參觀路線 並查集 dfs

lambdaland由n個城市組成,任兩個城市間都有一條道路相連。下個月tbl準備參觀lambdaland。他將從城市1開始,以深度優先搜尋順序參觀能所有遍歷到的城市。由於tbl是一位十分重要的人物,盯上了他,並在他出發之前炸毀了m條道路。現在 僱傭你寫乙個程式,求出tbl的參觀路線。如果有多解,輸...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

200 島嶼數量(並查集 DFS)

200.島嶼數量 方法一 dfs或bfs 遍搜尋遍改變,訪問陣列也不需要 class solution,int r int c public intnumislands char grid return res public void dfs int i,int j,char grid return...