:洛谷 P3367 【模板】并查集
https://www.luogu.org/problemnew/show/P3367
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=10005;
int root[maxn];
int N,M;
void initialize()
{
for(int i=0;i<=N;i++)
{
root[i]=i;
}
}
int find(int rr)
{
if(rr==root[rr])
return rr;
else return root[rr]=find(root[rr]);
}
void merge(int rx,int ry)
{
int u=find(rx),v=find(ry);
if(u!=v)
root[u]=v;
}
bool judge(int rx,int ry)
{
return find(rx)==find(ry);
}
int main()
{
while(~scanf("%d%d",&N,&M))
{
initialize();
int k,r1,r2;
while(M--)
{
scanf("%d%d%d",&k,&r1,&r2);
if(k==1)
{
merge(r1,r2);
}
else if(k==2)
{
if(judge(r1,r2))
{
printf("Y\n");
}
else printf("N\n");
}
}
}
return 0;
}
:HDU 1232 畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1005;
int root[maxn];
int N,M;
void initialize()
{
for(int i=0;i<=N;i++)
{
root[i]=i;
}
}
int find(int rr)
{
if(rr==root[rr])
return rr;
else return root[rr]=find(root[rr]);
}
void merge(int rx,int ry)
{
root[find(rx)]=root[find(ry)];
}
bool judge(int rx,int ry)
{
return find(rx)==find(ry);
}
int main()
{
while(~scanf("%d",&N)&&N)
{
scanf("%d",&M);
initialize();
int sum=0;
while(M--)
{
int rt1,rt2;
scanf("%d%d",&rt1,&rt2);
if(!judge(rt1,rt2))
{
merge(rt1,rt2);
sum++;
}
}
printf("%d\n",N-1-sum);
}
return 0;
}
:POJ 1611 The Suspects
http://poj.org/problem?id=1611
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=30005;
int root[maxn];
int N,M;
void initialize()
{
for(int i=0;i<=N;i++)
{
root[i]=i;
}
}
int find(int rr)
{
if(rr==root[rr])
return rr;
else return root[rr]=find(root[rr]);
}
void merge(int rx,int ry)
{
root[find(rx)]=root[find(ry)];
}
bool judge(int rx,int ry)
{
return find(rx)==find(ry);
}
int main()
{
while(~scanf("%d%d",&N,&M)&&(N||M))
{
initialize();
while(M--)
{
int k;
scanf("%d",&k);
int rs,rt;
scanf("%d",&rs);
k--;
while(k--)
{
scanf("%d",&rt);
if(!judge(rs,rt))
{
merge(rt,rs);
}
}
}
int sum=1;
for(int i=1;i<N;i++)
{
if(judge(0,i))
{
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}