| ||||||||||
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:哪位能提供些测试数据啊,我用并查集做的,交上去老是WA,代码如下:如发现问题请指正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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator