pku 1703 Find them, Catch them(比A bug's life难些)
//方法1,思路更清晰
#include <stdio.h>
#include <string.h>
#define MAXN 100005
int father[MAXN],diff[MAXN];
int find(int x)
{
int i,t;
for(i=x; father[i]>0; i=father[i]) ;
while(x!=i)
{
t=father[x];
father[x]=i;
x=t;
}
return i;
}
int merge(int x,int y)
{
if(x==-1) return y;
if(y==-1) return x;
int fx=find(x),fy=find(y);
if(fx==fy) return fx;
if(father[fx]>father[fy])
{
father[fy]+=father[fx];
return father[fx]=fy;
}
else
{
father[fx]+=father[fy];
return father[fy]=fx;
}
}
inline void divide(int i,int j)
{
int fi=find(i),fj=find(j);
int x=merge(diff[fi],fj);
int y=merge(fi,diff[fj]);
//x,y都是根,diff[]总是对根进行处理
diff[x]=y;
diff[y]=x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int N,M,i,j;
char ch;
scanf("%d %d",&N,&M);
getchar();
memset(father,-1,sizeof(*father)*(N+1));
memset(diff,-1,sizeof(*diff)*(N+1));
while(M--)
{
scanf("%c %d %d",&ch,&i,&j);
if(ch=='D')
{
divide(i,j);
}
else
{
int fi=find(i),fj=find(j);
if(fi==fj) printf("In the same gang.\n");
else if(fi==diff[fj]) printf("In different gangs.\n");
else printf("Not sure yet.\n");
}
getchar();
}
}
return 0;
}
//************************************************************************************
//方法2:
#include <stdio.h>
#include <string.h>
#define MAXN 100005
int father[MAXN],opp[MAXN];
int find(int x)
{
int i,t;
for(i=x;father[i]>0;i=father[i]) ;
while(x!=i)
{
t=father[x];
father[x]=i;
x=t;
}
return i;
}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy) return;
if(father[fx]>father[fy])
{
father[fy]+=father[fx];
father[fx]=fy;
}
else
{
father[fx]+=father[fy];
father[fy]=fx;
}
}
int main()
{
int T,k;
scanf("%d",&T);
for(k=0;k<T;k++)
{
int N,M,i,j;
char ch;
scanf("%d %d",&N,&M);
getchar();
memset(father,-1,sizeof(*father)*(N+1));
memset(opp,-1,sizeof(*opp)*(N+1));
while(M--)
{
scanf("%c %d %d",&ch,&i,&j);
if(ch=='D')
{
if(opp[i]==-1) opp[i]=j;
else merge(opp[i],j);
if(opp[j]==-1) opp[j]=i;
else merge(opp[j],i);
}
else
{
int oi=opp[i],oj=opp[j],fi=find(i),fj=find(j);
if(fi==fj) printf("In the same gang.\n");
else if( (oi!=-1 && find(oi)==fj) || (oj!=-1 && find(oj)==fi) ) //另一个在自己的对方gang中(即不在自己的gang中)
printf("In different gangs.\n");
else printf("Not sure yet.\n");
}
getchar();
}
}
return 0;
}
浙公网安备 33010602011771号