並查集 連線格點 C

2022-05-11 16:55:22 字數 719 閱讀 5901

連線格點

描述有乙個m行n列的點陣,相鄰兩點可以相連。一條縱向的連線花費乙個單位,一條橫向的連線花費兩個單位。某些點之間已經有連線了,試問至少還需要花費多少個單位才能使所有的點全部連通。

輸入第一行輸入兩個正整數m和n, 其中 1 <= n,m <= 1000。

以下若干行每行四個正整數x1,y1,x2,y2,表示第x1行第y1列的點和第x2行第y2列的點已經有連線。輸入保證|x1-x2|+|y1-y2|=1。

輸出輸出使得連通所有點還需要的最小花費。

輸入樣例 1

2 21 1 2 1

輸出樣例 1

3

這道題明顯使用並查集來完成,但是需要把由(x,y)組成的座標轉成乙個數字,所以就令點(x,y)為點(x-1)*m+y即可,其他的就是再普通不過的並查集來完成了。

#includeusing namespace std;

int n,m,a,b,c,d,ans;

int fa[1000000+10];

int convert(int x,int y)

void init() }}

int get(int x)

bool merge(int x,int y)

int main()

for(int j=1;j<=m;j++)

}} for(int j=1;j<=m;j++)

}} cout

並查集 冗餘連線

思路 記錄1到n的每個數的根,因為如果有環,導致環相連的 u,v 一定有相同的root,我們可以理解為是乙個節點的兩個分支,通過 u,v 被連起來了,既然他們是乙個節點的兩個分支,那麼他們一定有相同的root,所以直接移除 u,v 就好啦。class solution def findredunda...

任意點 並查集

傳送門 方法就是在同一行的是乙個集合,在同一列的也是乙個集合,先存再乙個乙個列舉即可。這裡主要就是要注意,當所有的點都已經全部連線完畢之後,編號為i的點的祖先並不是fa i 而是fin i 因為最後還要進行一次預處理,將所有的點都重新整合一遍 防止出現類似於,1,2,3,4,5是乙個集合,那麼可能f...

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...