[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...