您的位置:首页 > 其它

poj之旅——2236,1703

2016-05-27 12:36 253 查看
题目描述:有N台电脑坏了,它们原本组成这样一个局域网:距离d内的两台电脑互联。现在通过修理和查看操作,求查看时两台电脑是否互联

题目描述:有N名来自两个帮派的坏蛋,已知一些坏蛋两两不属于同一帮派,求判断给定两个坏蛋是否属于同一帮派

题解:并查集的基本应用,直接看程序。

参考程序:

2236:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int f[2000];
int x[2000],y[2000];
int n,d;
bool have[2000];
int find(int x){
if (f[x] != x)f[x]=find(f[x]);
return f[x];
}
void unite(int x,int y){
x=find(x);y=find(y);
if (x != y) f[y]=x;
}
bool same(int x,int y){
x=find(x);y=find(y);
return x==y;
}
int sqr(int x){
return x*x;
}
int main(){
scanf("%d %d",&n,&d);
for (int i=0;i<n;i++)scanf("%d %d",&x[i],&y[i]);
char now;
for (int i=0;i<n;i++)f[i]=i;
while (cin>>now){
if (now=='O'){
int id;
cin>>id;
id--;have[id]=true;
for (int i=0;i<n;i++)
if (i != id)
if (have[i] && sqr(x[i]-x[id])+sqr(y[i]-y[id])<=d*d)unite(i,id);
}else{
int id1,id2;
cin>>id1>>id2;
id1--;id2--;
if (same(id1,id2))printf("SUCCESS\n");
else printf("FAIL\n");
}
}
return 0;
}


1703:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 1000000
using namespace std;
int op[maxn];
int f[maxn];
int find(int x){
return f[x]=f[x]==x?x:find(f[x]);
}
void unite(int x,int y){
int a=find(x),b=find(y);
f[b]=a;
}
int main(){
int T;
scanf("%d",&T);getchar();
while (T--){
int n,m;
scanf("%d %d",&n,&m);
for (int i=1;i<=n;i++)f[i]=i;
memset(op,0,sizeof(op));
for (int i=0;i<m;i++){
int x,y;char cmd=getchar();
scanf("%c %d %d",&cmd,&x,&y);//经检验可用scanf("\n%c%d%d",&cmd,&x,&y);无需getchar
if (cmd=='D'){
if (op[x]+op[y]==0){op[x]=y;op[y]=x;}else{
if (op[x]==0)op[x]=y;
if (op[y]==0)op[y]=x;
unite(op[x],y);
unite(op[y],x);
}
}else if (n==2)printf("In different gangs.");else{
int a=find(x),b=find(y),c=find(op[x]);
if (a==b)printf("In the same gang.");
else if (b==c)printf("In different gangs.");
else printf("Not sure yet.");
printf("\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: