傳送門
方法就是在同一行的是乙個集合,在同一列的也是乙個集合,先存再乙個乙個列舉即可。
這裡主要就是要注意,當所有的點都已經全部連線完畢之後,編號為i的點的祖先並不是fa[i],而是fin(i),因為最後還要進行一次預處理,將所有的點都重新整合一遍(防止出現類似於,1,2,3,4,5是乙個集合,那麼可能fa[1]=1,fa[2]=1,fa[3]=2,fa[4]=3,fa[5]=3這種情況)
#include
using
namespace std;
const
int mx=
1e3+9;
int n,fa[mx]
,pos[mx]
;vector<
int> vh[mx]
,vl[mx]
;int
fin(
int u)
void
link
(int u,
int v)
}int
main()
for(
int i=
1; i<=
1000
; i++
)for
(int i=
1; i<=
1000
; i++
)memset
(pos,0,
sizeof
(pos));
int ans=0;
for(
int i=
1; i<=n ; i++
) pos[
fin(i)]=
1;for(
int i=
1; i<=n ; i++)if
( pos[i]
) ans++
;printf
("%d\n"
,ans-1)
;return0;
}
任意點 並查集求聯通塊
任意點時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數...
並查集 並查集
本文參考了 挑戰程式設計競賽 和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 ...
並查集 知識點
並查集學習 l 並查集 union find sets 一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數等。最完美的應用當屬 實現kruskar演算法求最小生成樹。l 並查集的精髓 即它的三種操作,結合實現 模板進行...