#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int n, m;
int fa[10010];
int find(int x)
{
int r = x;
while (r != fa[r])
{
r = fa[r];
}
int i = x, j;
while (fa[i] != r)
{
j = fa[i];
fa[i] = r;
i = j;
}
return r;
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x != y)
fa[y] = x;
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
for (int i = 1; i <= n; i++)
{
fa[i] = i;
}
for (int i = 1; i <= m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
unite(a, b);
}
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (fa[i] == i)
{
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}
简单的并查集模板题,注意最好用循环查找模板,数据多,防超时。
畅通工程
也是模板题,但这是我刚做并查集的题。
阐述一下简单思路:
1.题目要求:输入测试用例,输出最少还需建设的道路。
2.思路:只需将每个输入实例,合并,看最后有几个根,即畅通工程所需的最少路。
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int N, M;
int fa[1100];
int find(int x)
{
int r = x;
while (r != fa[r])
{
r = fa[r];
}
int i = x,j;
while (fa[i] != r)
{
j = fa[i];
fa[i] = r;
i = j;
}
return r;
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
return;
fa[y] = x;
}
int main()
{
while (scanf("%d", &N) != EOF)
{
if (N == 0)
{
break;
}
scanf("%d", &M);
for (int i = 1; i <= N; i++)
{
fa[i] = i;
}
for (int i = 0; i < M; i++)
{
int a, b;
scanf("%d%d", &a, &b);
unite(a, b);
}
int h[1100];
memset(h, 0, sizeof(h));
for (int i = 1; i <= N; i++)
{
h[find(i)]=1;
}
int cnt = 0;
for (int i = 1; i <= N; i++)
{
if (h[i])
cnt+=1;
}
cout << cnt-1 << endl;
}
return 0;
}
3.how many tables
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int N, M, T;
int fa[1100];
int find(int x)
{
int r = x;
while (r != fa[r])
{
r = fa[r];
}
int i = x,j;
while (fa[i] != r)
{
j = fa[i];
fa[i] = r;
i = j;
}
return r;
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
return;
fa[y] = x;
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++)
{
fa[i] = i;
}
for (int i = 0; i < M; i++)
{
int a, b;
scanf("%d%d", &a, &b);
unite(a, b);
}
int cnt = 0;
for (int i = 1; i <= N; i++)
{
if (fa[i] == i)
{
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}