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

并查集做的 188ms (附代码)

Posted by fengchengyuan at 2009-10-13 19:31:36 on Problem 1182
#include<stdio.h>
#define max 50000
int father[max+1];

int s[max+1][2];
//#include <string.h>
//#include <stdlib.h>
//#include <time.h>
int n=80,k=300;
int hua[1111][3]={0,0,0

};



fun_max(int a,int b)
{return a>b?a:b;}

fun_min(int a,int b)
{return a<b?a:b;
}


find(int n)
{int temp,ans,i;
int s0=0,s1=0;
if(n<=0)printf("error\n");
for(i=n;i!=father[i];)
{s[i][0]=fun_max(s[i][0],s0);
s[i][1]=fun_max(s[i][1],s1);
s0=s[i][0];
s1=s[i][1];
i=father[i];}
ans=i;
for(i=n;i!=father[i];){  temp=father[i];  father[i]=ans;i=temp;   }
return ans;
}


judge(int i,int j)
{
int n1,n2,n3,n4;
n1=find(i);
n2=find(j);
if(n1==n2)return 1;//同类
if((s[n1][1]!=0)&&(find(s[n1][1])==n2)   )return 2;  //i catch j
if((s[n2][1]!=0)&&(find(s[n2][1])==n1)   )return 3;  //j catch i
return 0;  //random
}


init()
{int a;
for(a=1;a<=n;a++){father[a]=a;s[a][0]=s[a][1]=0;}
}




fun_merge(int i,int j)
{
int n1,n2;
if(i==0||j==0)return i+j;
n1=find(i);
n2=find(j);
father[n1]=n2;
return n2;

}

fun_equal(int i,int j)
{
int n1=find(i),n2=find(j);
int n3,n4,n5;
n3=fun_merge(n1,n2);
n4=fun_merge(s[n1][0],s[n2][0]);

n5=fun_merge(s[n1][1],s[n2][1]);
if(n4!=0){  s[n4][0]=n5;s[n4][1]=n3;       }
if(n5!=0){   s[n5][0]=n3;s[n5][1]=n4;         }
s[n3][0]=n4;
s[n3][1]=n5;
}



fun_catch(int i,int j)
{

	int n1,n2;
	int n3,n4,n5;
	n1=find(i);
	n2=find(j);

	n3=fun_merge(s[n1][0],s[n2][1]);
	n4=fun_merge(n1,s[n2][0]);
	n5=fun_merge(s[n1][1],n2);
s[n4][0]=n3;s[n4][1]=n5;
if(n3!=0){  s[n3][0]=n5; s[n3][1]=n4;          }
if(n5!=0){       s[n5][0]=n4;s[n5][1]=n3;   }
}


fun()
{int a,b,c;
int n1,n2,n3;
int ans=0;
int temp;
int f;
init();

//fun_catch(1,5);fun_catch(9,3);fun_equal(1,8);fun_equal(2,5);fun_equal(2,9);
//for(a=1;a<=n;a++){printf("%d ",father[a]); }printf("\n");for(a=1;a<=n;a++){printf("%d %d\n",s[a][0],s[a][1]); }

for(a=1;a<=k;a++)
{
temp=ans;
//n1=hua[a-1][0];n2=hua[a-1][1];n3=hua[a-1][2];
scanf("%d%d%d",&n1,&n2,&n3);
if(n2>n||n3>n){ ans++;}
else
{
if(n1==1)
{
	if(n2==n3){   }
	else
	{
f=judge(n2,n3); 
if(f==0){  fun_equal(n2,n3);}
else if(f==1){}
else if(f==2||f==3){     ans++; }

	}


}
else if(n1==2)
{
	if(n2==n3){     ans++;}
	else{          
	f=judge(n2,n3); 
	
	if(f==0){ fun_catch(n2,n3); }
	else if(f==1||f==3){ans++;}
	else if(f==2){}
	}
}

}
//printf("%s",temp==ans?"t":"f");
//for(b=1;b<=n;b++){printf("%d ",father[b]); }printf("\n");for(b=1;b<=n;b++){printf("%d %d\n",s[b][0],s[b][1]); }printf("\n");

}

printf("%d\n",ans);
}

//#include"11.h" 
int main()
{scanf("%d",&n);
scanf("%d",&k);
fun();
//printf("right answer:  ");	fun2();
return 0;


}

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