codevs 1002 搭橋 題解報告

2021-07-23 18:35:38 字數 2699 閱讀 3810

繼續我的刷題之路。。。

*題目描述 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 5

#.#..

…..

….#樣例輸出 sample output

樣例1

5 4 4

樣例2

2 0 0

樣例3

1 0 0

樣例4

3 1 1

資料範圍及提示 data size & hint

見描述*

噫。 首先,dfs求聯通塊,just like 球細胞個數

v表示每個點所在聯通塊的編號;

考慮對於每個點,有12個方向上的點可以鏈結。

所以,列舉這條直線上所有點

b表示兩個聯通塊之間最短的邊

之後跑克魯斯卡爾

求最小生成樹;

得到答案~!~!~!~

**!:~

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 1000000000

#define fi first

#define se second

#define n 100005

#define p 1000000007

#define debug(x) cerr<<#x<<"="<#define mp(x,y) make_pair(x,y)

using namespace std;

int n,m,a[51][51],v[1001][1001],f[1001],ans=0;

int b[1001][1001];

int kk=1;

int fx[9]=;

int fy[9]=;

int find(int

x)struct zqm

q[100001];

inline int get_num()

//忽略這一堆沒用的讀入優化

void dfs(int

x,int

y) }

}bool cmp(zqm a ,zqm b)

int main()

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

kk--;

coutb[v[i][j]][v[k][l]]=min(b[v[i][j]][v[k][l]],i-k-1);

b[v[k][l]][v[i][j]]=b[v[i][j]][v[k][l]];}}

for(int k=i+2;k<=n;k++)

b[v[i][j]][v[k][l]]=min(b[v[i][j]][v[k][l]],k-i-1);

b[v[k][l]][v[i][j]]=b[v[i][j]][v[k][l]];}}

for(int k=i-1;k<=i+1;k++)

b[v[i][j]][v[k][l]]=min(b[v[i][j]][v[k][l]],j-l-1);

b[v[k][l]][v[i][j]]=b[v[i][j]][v[k][l]];}}

for(int k=i-1;k<=i+1;k++)

b[v[i][j]][v[k][l]]=min(b[v[i][j]][v[k][l]],l-j-1);

b[v[k][l]][v[i][j]]=b[v[i][j]][v[k][l]];}}

}}

int p=0;

/*for(int i=1;i<=n;i++)

//coutfor(int i=1;i<=kk;i++)

int pp=kk;

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

cout<" "

《噫話說為啥我上傳不了。

搭橋 CODEVS 1002 ,詳細注釋

考查最小生成樹,這裡用kruskal演算法實現,裡面用到了並查集。include include include include using namespace std int n,m 0 行列數 char input 2505 輸入的資料 struct bcj 找爸爸的遞迴函式,不停去找,直到找到...

PAT乙級訓練題 1002

讀入乙個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。輸入格式 每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。輸出格式 在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後乙個拼音數字後沒有空格。輸入樣例 123456789098765...

PAT乙級真題1002

1002 寫出這個數 20 20 分 讀入乙個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。輸入格式 每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10 100 輸出格式 在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後乙個拼音數字後沒有空格。...