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

Re:哪位能提供些测试数据啊,我用并查集做的,交上去老是WA,代码如下:如发现问题请指正

Posted by fireliuyu at 2008-10-30 22:34:29 on Problem 3620
In Reply To:哪位能提供些测试数据啊,我用并查集做的,交上去老是WA,代码如下:如发现问题请指正 Posted by:fireliuyu at 2008-10-30 17:20:21
> #include  <iostream>
> #include  <algorithm>
> #include  <math.h>
> using  namespace  std;
> 
> int  n, m, k, num1, num2, sum;
> 
> int  i, j,  t;
> 
> int  used[104][104], parent[104][104], rank[104][104];
> 
> //建立一个节点 ,由于每个节点的位置都不同故可以用i*10+j来记录其位置
> void  makeset(int  i, int  j)
> {
> 	parent[i][j] = i*10 + j;
> 	used[i][j] = true;
> 	rank[i][j] = 1;
> 
> }
> 
> //寻找该点所在根节点,并压缩路径
> int  findset(int  i, int  j)
> {
> 	int  t;
> 	int  tempi =i, tempj = j;
> 	while( tempi*10 + tempj != parent[tempi][tempj] )
> 	{
> 		t = parent[tempi][tempj];
> 		tempi = t/10;
> 		tempj = t%10;
> 	}
> 	while( i*10 + j != tempi*10 + tempj)
> 	{
> 		t = parent[i][j];
> 		parent[i][j] = tempi*10 +tempj;
> 		i = t/10;
> 		j = t%10;
> 		
> 	}
> 	return  tempi*10 + tempj;
>     
> }
> 
> //合并两棵树,这里用rank[i][j]来记录根的地位并同时用其代表水坑的坑数
> 
> void unionset(int  i, int  j, int  i1,int  j1 )
> {
> 	int  t = findset(i, j);
> 	int tep;//暂时变量
> 	i = t/10; j = t%10;
> 	t = findset(i1, j1);
> 	i1 = t/10; j1 = t%10;
> 	if( i == i1&& j == j1)
> 		return ;
> 	if( rank[i][j]>rank[i1][j1] )
> 	{
> 		parent[i1][j1] = parent[i][j];
> 		rank[i][j] += rank[i1][j1];
> 		tep = rank[i][j];
> 		
> 	}
> 	else
> 	{
> 		parent[i][j] = parent[i1][j1];
> 		rank[i1][j1] += rank[i][j];
> 		tep = rank[i1][j1];
> 	}
> 	if( tep > sum)
> 		sum = tep;
> 	
> 
> }
> 
> 
> 
> int  main()
> {
> 	while (cin>>n>>m>>k)
> 	{
> 		memset(used , 0, sizeof(used));
> 		sum = 1;
> 		for( i = 0; i < 101; i++)
> 			for(j = 0; j < 101; j++)
> 				rank[i][j] = 1; 
> 
> 		for( i = 1; i <= k ; i++)
> 		{
> 			cin>>num1>>num2;
> 			if(used[num1][num2])//如果坑已经输入了,就continue;
> 				continue;
> 			makeset(num1, num2);
> 			if(used[num1-1][num2])//以下四个用于找该点4周的树,若有,合并
> 				unionset(num1-1 , num2, num1, num2);
> 			if(used[num1+1][num2])
> 				unionset(num1+1, num2, num1, num2);
> 			if(used[num1][num2-1])
>                  unionset(num1,num2-1, num1, num2);
> 			if(used[num1][num2+1])
> 				unionset(num1, num2+1, num1, num2);
> 
> 		}
> 		cout<<sum<<endl;
> 
> 	}
> 	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