| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
并查集..代码留给路人..记录每一个集合可以吃掉的集合和可以被哪个集合吃掉..#include "stdio.h"
#include "memory.h"
int head;
int front[50001];
int next[50001];
int father[50001];
int num[50001];
void make_set(int n)
{
for(int i=1;i<=n;++i)
{
father[i]=i;
num[i]=1;
}
next[0]=front[0]=0;
memset(front+1,0,sizeof(int)*n);
memset(next+1,0,sizeof(int)*n);
}
int find_set(int x)
{
while(x!=father[x])
x=father[x];
return x;
}
int Union(int x,int y)
{
next[y]=front[y]=next[x]=front[x]=0;
if(x==y) return x;
if(x==0)
return y;
else if(y==0)
return x;
else
{
if(num[x]>num[y])
{
num[x]+=num[y];
father[y]=x;
num[y]=0;
return x;
}
else
{
num[y]+=num[x];
father[x]=y;
num[x]=0;
return y;
}
}
}
void Union_x(int x,int y)
{
if(x==y) return;
int n1=0,n2=0,n3=0,next1=next[x],next2=next[y],front1=front[x],front2=front[y];
n1=Union(x,y);
n2=Union(next1,next2);
n3=Union(front1,front2);
if(n2!=0)
{
next[n2]=n3;
front[n2]=n1;
}
if(n3!=0)
{
front[n3]=n2;
next[n3]=n1;
}
next[n1]=n2;
front[n1]=n3;
}
int main(void)
{
int a,b,c, n,k,count=0,x,y;
scanf("%d%d",&n,&k);
make_set(n);
for(int i=0;i!=k;++i)
{
scanf("%d%d%d",&a,&b,&c);
if(b>n||c>n) {count++;continue;}
x=find_set(b);
y=find_set(c);
if(a==1)
{
if(front[x]==y||next[x]==y) count++;
else Union_x(x,y);
}
else
{
if(x==y||front[x]==y) {count++;continue;}
if(next[x]!=0) Union_x(next[x],y);
else if(front[y]!=0) Union_x(front[y],x);
else if(front[x]!=0&&next[y]!=0)
{
a=Union(front[x],next[y]);
front[x]=next[y]=a;
next[a]=front[y]=x;
next[x]=front[a]=y;
}
else if(front[x]!=0)
{
front[front[x]]=y;
next[y]=front[x];
next[x]=y;
front[y]=x;
}
else if(next[y]!=0)
{
front[x]=next[y];
next[next[y]]=x;
next[x]=y;
front[y]=x;
}
else
{
next[x]=y;
front[y]=x;
}
}
}
printf("%d\n",count);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator