poj之旅——2236,1703

来源:互联网 发布:木马网络行为分析 编辑:程序博客网 时间:2024/06/10 17:00

题目描述:有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 1000000using 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);无需getcharif (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;}

0 0
原创粉丝点击