- 1073
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int pre[50005];
void init(int n){
for(int i=0; i<n; i++)
pre[i] = i;
}
int Find(int x){
if(pre[x] != x) return pre[x] = Find(pre[x]);
else return x;
}
void Unit(int x, int y){
int X = Find(x);
int Y = Find(y);
if(X != Y)
pre[Y] = X;
return;
}
int main()
{
int n,m;
scanf("%d %d", &n, &m);
init(n);
while(m--){
int a,b;
scanf("%d %d", &a, &b);
Unit(a,b);
}
int ans=0;
int f = Find(0);
for(int i=0; i<n; i++)
if(Find(i) == f)
ans++;
printf("%d\n",ans);
return 0;
}
- 1173(混入并查集的一道数学题)
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d %d", &n, &m)){
if(n>2)
{
int a = (((n)*(n-1))/2)-(n-1); //- (n-1);
//printf("%d\n", a);
if(m <= a)
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
return 0;
}
- 1490(我觉得数据太不严谨了,这应该是一道单向并查集,但是双向也能ac.......................................)
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int pre[30];
int vis[26];
void init(){
for(int i=0; i<30; i++)
pre[i] = i;
}
int Find(int x){
if(pre[x] != x) return pre[x] = Find(pre[x]);
else return x;
}
void Unit(int x, int y){
int X = Find(x);
int Y = Find(y);
if(X != Y)
pre[X] = Y;
return;
}
int main()
{
int n;
while(~scanf("%d", &n)){
init();
memset(vis, 0, sizeof(vis));
while(n--){
char p[55];
scanf("%s", p);
int len = strlen(p);
vis[p[len-1]-'a'] = 1;
//vis[p[0]-'a'] = 1;
Unit(p[0]-'a', p[len-1]-'a');
}
if(Find('s'-'a') == Find('w'-'a')&&vis['w'-'a'])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
- 1725(写的有点丑... 最后附上一个边界样例)
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
using namespace std;
int pre[1001];
int a[10011];
void init(int n){
for(int i=0; i<n; i++)
pre[i] = i;
}
int Find(int x){
return x == pre[x]?x:pre[x] = Find(pre[x]);
}
void Unit(int x, int y){
x = Find(x);
y = Find(y);
if(x != y){
pre[x] = y;
}
return;
}
void ans(int x, int n){
int f = Find(x);
int vir[1001]; //存放病毒
int count = 0;
for(int i=1; i<=n; i++)
if(Find(i) == f)
vir[count++] = a[i];
sort(vir, vir+count);
if(vir[count-1] == 0) {printf("0\n"); return;}
int i=0;
for(i=0; i<count; i++){if(vir[i] != 0) break;}
printf("%d", vir[i]);
for(i = i+1; i<count; i++){
if(vir[i] == vir[i-1]) continue;
printf(" %d", vir[i]);
}
printf("\n");
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
int n, q;
scanf("%d%d", &n, &q);
init(n);
a[0] = 0;
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
for(int i=0; i<q; i++){
char c[10];
int g;
scanf("%s%d", c, &g);
if(c[0] == 'q'){
ans(g, n);
}
else{
int d;
scanf("%d", &d);
Unit(g, d);
}
}
printf("\n");
}
return 0;
}
/*
2
4 6
20 0 24 30
query 1
query 4
query 4
query 4
touch 1 4
query 2
4 6
7 0 28 0
touch 4 1
query 2
query 1
query 3
query 3
query 4
*/
- 1160
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int pre[30005];
void init(int n){
for(int i=0; i<=n; i++)
pre[i] = i;
}
int Find(int x){
return x == pre[x] ? x:pre[x] = Find(pre[x]);
}
void Unit(int x, int y){
x = Find(x);
y = Find(y);
if(x != y)
pre[x] = y;
return;
}
int main()
{
int n,m;
while(~scanf("%d%d", &n, &m)){
if(!n && !m) break;
init(n);
while(m--){
int num;
scanf("%d", &num);
if(num == 0) break;
int a,b;
scanf("%d", &a);
for(int i=1; i<num; i++){
scanf("%d", &b);
Unit(a, b);
}
}
int num=0;
for(int i=0; i<n; i++){
if(Find(i) == Find(0)) num++;
}
printf("%d\n", num);
}
}