考查最小生成樹,這裡用kruskal演算法實現,裡面用到了並查集。
#include
#include
#include
#include
using namespace std;
int n,m=0;
//行列數
char input[
2505];
//輸入的資料
struct bcj
//找爸爸的遞迴函式,不停去找,直到找到祖宗為止
intgetf
(int x)
else
}//合併兩個子集
intmerge
(int x,
int y)
return0;
}} b;
struct coord coo[
2505];
struct dist dis[
6250005];
//最多有2500個建築物,所以最多有2500*2500條邊
bool comp
(const dist &a,
const dist &b)
intmain()
if(input[i]
=='#'
) temp_y++
;//列++
if(temp_y==m+1)
}//開始計算建築物之間的距離
int pos=1;
for(
int i=
1; i<=n*m-
1; i++)if
(t1>
1&&t2>1)
if(t1<=
1&&t2>1)
if(t2<=
1&&t1>1)
pos++;}
}}}sort
(dis+
1,dis+pos,comp)
;//把所有邊根據w(長度)進行從小到大排序
b.init()
;//並查集初始化
int bridge_len=0;
//橋的總長度
int bridge_sum=0;
//橋的數目
int count=0;
//提前退出迴圈的標記
int t=0;
//遍歷所有邊,把符合條件的進行合併
for(
int i=
1; i}if
(count==temp_city-1)
break;}
//下面開始計算建築物數
b.init()
;//重新初始化
for(
int i=
1; ifor(
int i=
1; i<=n*m; i++)}
cout
" "<
return0;
}
codevs 1002 搭橋 題解報告
繼續我的刷題之路。題目描述 description 有一矩形區域的城市中建築了若干建築物,如果某兩個單元格有乙個點相聯絡,則它們屬於同一座建築物。現在想在這些建築物之間搭建一些橋梁,其中橋梁只能沿著矩形的方格的邊沿搭建,如下圖城市1有5棟建築物,可以搭建4座橋將建築物聯絡起來。城市2有兩座建築物,但...
codevs 3185 佇列練習1
題目描述 description 給定乙個佇列 初始為空 只有兩種操作入隊和出隊,現給出這些操作請輸出最終的隊頭元素。操作解釋 1表示入隊,2表示出隊 輸入描述 input description n 操作個數 n個操作 如果是入隊則後面還會有乙個入隊元素 具體見樣例 輸入保證隊空時不會出隊 輸出描...
codevs 3185 佇列練習1
題目描述 description 給定乙個佇列 初始為空 只有兩種操作入隊和出隊,現給出這些操作請輸出最終的隊頭元素。操作解釋 1表示入隊,2表示出隊 輸入描述 input description n 操作個數 n個操作 如果是入隊則後面還會有乙個入隊元素 具體見樣例 輸入保證隊空時不會出隊 輸出描...