並查集可以有很多應用。比如權值並查集或帶擴充套件域的並查集,可以來維護一些可傳遞的關係。當然,並查集最直接的應用,則是來維護集合的的連通關係。
第一題題意:給出一幅圖,以及一系列操作,每次操作刪去乙個點,及這個點相關的所有邊,並輸出刪點之後的連通塊個數。
思路:這道題把過程倒著來就好了,可以看成建圖的過程,如果要新加一條邊,這條邊連線的兩個點若是在不同的連通塊內,連邊後,聯通快個數就++。
#include
#include
using
namespace std;
const
int maxn =
4e5+5;
vector<
int> v[maxn]
;vector<
int> ans;
struct edgeedge[maxn]
;struct pointpoint[maxn]
;bool book[maxn]
;int n, m, k;
//並查集部分
int pre[maxn]
;int
getfather
(int u)
void
merge
(int u,
int v)
intmain()
cin >> k;
int x;
for(
int i =
1; i <= k;
++i)
int tot =0;
for(
int i =
1; i <= m;
++i)
else
}for
(int i =
0; i < n;
++i)
tot -
= k;
ans.
push_back
(tot)
;for
(int i = k; i >=1;
--i)
} tot++
; book[node]
=false
; ans.
push_back
(tot);}
int len = ans.
size()
;for
(int i = len-
1; i >=0;
--i)
return0;
}
第二題
這題並查集有兩個應用,因為每乙個點都只能有一次從0變到1,所以我們對於每一行可以維護乙個並查集,每個點指向右端第乙個0,這樣利用並查集「暴力修改」即可。然後總體的連通性再開乙個並查集維護
#include
#include
using namespace std;
const
int maxn =
4e5+5;
int tot;
int n, m, q;
char mp[
1005][
1005];
//並查集維護每一行的連通情況,每個連通塊最右端為0
int rt[
1005][
1005];
//right[i][j]代表第i行第j列的父親,根節點指向右邊第乙個0
intgetfirstzero
(int row,
int col)
void
link
(int row,
int u,
int v)
//並查集維護所有1塊的連通情況
int pre[
1005
*1005];
intgetfather
(int u)
intmerge
(int u,
int v)
}int
main()
mp[i]
[m+1]=
'0';
}//預處理每行連通塊情況
for(
int i =
1; i <= n;
++i)
}for
(int i =
1; i <= n;
++i)
}//預處理總體連通情況
for(
int i =
1; i <= n;
++i)
for(
int j =
1; j <= m;
++j)
pre[i*m+j]
= i*m+j;
for(
int i =
1; i <= n;
++i)}}
tot =0;
for(
int i =
1; i <= n;
++i)
}//輸入給定區域
cin >> q;
int x1, x2, y1, y2;
while
(q--)}
cout << tot << endl;
}return0;
}
並查集的應用
特點 1,都有乙個陣列儲存它的根節點 2,用vis陣列儲存其是否訪問過 3,如果cnt 1 說明該圖是連通的。連通圖中只有根節點的父節點是自身,cnt應該是1 解決的題目 1,題目已經給了圖上頂點之間的關係,通過頂點之間的關係,求連通分量的個數 include stdio.h int bin 100...
並查集及其應用
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...
並查集及其應用
並查集 union find sets 是一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數 最小公共祖先 帶限制的作業排序,還有最完美的應用 實現kruskar演算法求最小生成樹。其實,這一部分 演算法導論 講的很精...