| ||||||||||
| 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 | |||||||||
Re:可以的,链表存下所有插入记录,遇到删除就重新插入一遍,可达到500MS左右,应该比构图快In Reply To:可以的,链表存下所有插入记录,遇到删除就重新插入一遍,可达到500MS左右,应该比构图快 Posted by:iscubus at 2011-10-15 22:12:43 # include <stdio.h>
# include <string.h>
int table[20002][2],next[20002],en,head;
int n,m;
int father[1005],rank[1005];
int find(int x)
{
if(father[x]==-1) return x;
return father[x]=find(father[x]);
}
int main()
{
char c;int a,b,x,y,p,q;
//freopen("in","r",stdin);
memset(father,-1,sizeof(father));
memset(next,-1,sizeof(next));
memset(rank,0,sizeof(rank));
en=0;
scanf("%d%d\n",&n,&m);
while(m--)
{
c=getchar();
scanf("%d %d\n",&a,&b);
if(c=='Q')
{
if(find(a)==find(b))
printf("Y\n");
else printf("N\n");
}else if(c=='I')
{
table[++en][0]=a;
table[en][1]=b;
next[en]=next[0];
next[0]=en;
x=find(a);y=find(b);
if(x!=y)
{
if(rank[x]>rank[y])
father[y]=x;
else
{
father[x]=y;
if(rank[x]==rank[y]) rank[y]++;
}
}
}else if(c=='D')
{
memset(father,-1,sizeof(father));
memset(rank,0,sizeof(rank));
p=next[0];q=0;
while(p!=-1)
{
x=table[p][0];
y=table[p][1];
if(x==a&&y==b||x==b&&y==a)
{
next[q]=next[p];
}else
{
x=find(x);y=find(y);
if(x!=y)
{
if(rank[x]>rank[y])
father[y]=x;
else
{
father[x]=y;
if(rank[x]==rank[y])
rank[y]++;
}
}
}
q=p;
p=next[p];
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator