Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

为什么并查集会超时啊?带路径压缩

Posted by cgp2001 at 2007-07-20 20:10:01 on Problem 1703
#include "STDIO.h"
#include "memory.h"
#define M 100001
int group=-1;
int criminal[M];
int enemy[M];
int stack[M],top=0;
void Update(int x,int y);
int Query(int x,int y);
int Find(int x);
void Union(int x,int y);
inline int min(int a,int b){return a<b?a:b;}
int main(int argc, char* argv[])
{
	int T;
	scanf("%d",&T);
	int n,m;
	while (T--)
	{
		scanf("%d%d",&n,&m);
		memset(criminal,0,sizeof(criminal));
		memset(enemy,0,sizeof(enemy));
		int i,x,y;
		char c;
		for(i=1;i<=m;i++)
		{
			scanf(" %c%d%d",&c,&x,&y);
			switch(c) {
			case 'D':
				 Update(Find(x),Find(y));
				break;
			case 'A':
				if(x==y)
				{
					printf("In the same gang.\n");
					continue;
				}
				int k=Query(Find(x),Find(y));
				switch(k) {
				case 1:
					printf("Not sure yet.\n");
					break;
				case 2:
					printf("In the same gang.\n");
					break;
				case 3:
					printf("In different gangs.\n");
					break;
				}
				break;
			}
		}
	}
	return 0;
}

void Update(int x,int y){
	int k1=min(criminal[x],criminal[y]);
	int k2=criminal[x]+criminal[y]-k1;
    if( (k1+1==k2&&(-k2)%2 ) || (k1==k2&&k2!=0) )  return;
    if(enemy[x]==0&&enemy[y]==0)
	{
        criminal[x]=group;
		criminal[y]=group-1;
		enemy[x]=y;
		enemy[y]=x;
		group-=2;
	}
	else if(enemy[x]==0&&enemy[y]!=0)
	{
		Union(enemy[y],x);
		enemy[y]=x;
	}
	else if(enemy[x]!=0&&enemy[y]==0)
	{
		Union(enemy[x],y);
		enemy[y]=x;
	}
	else 
	{
		Union(enemy[x],y);
		Union(x,enemy[y]);
	}
}

int Find(int x)
{
    top=0;
    while (criminal[x]>0)
    {
       stack[top++]=x;
	   x=criminal[x];
    }
	while (top>0)
	{
		criminal[stack[--top]]=x;
	}
	return x;
}
void Union(int x,int y)
{
	    criminal[y]=Find(x);
}

int Query(int x,int y)
{
	int k1=min(criminal[x],criminal[y]);
	int k2=criminal[x]+criminal[y]-k1;
	if(k1+1==k2 && (-k1)%2==0 )
		return 3;
	else if(k1==k2&& k1!=0)
		return 2;
	else return 1;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator