| ||||||||||
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 |
并查集的合并操作错了In Reply To:help me!!!WA Posted by:laddiexu at 2006-05-03 23:09:56 整个程序三个问题: 1.并查集的合并操作不对 2.输入字符时处理错误,不应用scanf("%c", &c),输入的可能是空格或换行符 3.POJ上没有longlong(int前加个longlong好像没啥效果),也就没有"%lld" 需要64位整数,请用__int64,及"%I64d" 下面是修改过的并查集代码: //----------------------------------------- void UFset:: unionset(int root1,int root2) { if(root1 == root2) return; if ( parent[root2] < parent[root1] ) { parent[root1] = root2; } else { parent[root2] = root1; } } > #include<cstdio> > #include<fstream> > #include<vector> > using namespace std; > > struct co > { > long long int x; > long long int y; > }; > > class UFset > { > public: > UFset(int s) ; > int find(int i); > void unionset(int root1,int root2); > private: > int size; > int* parent; > }; > //----------------------------------------- > UFset :: UFset ( int s ) > { size = s; > parent = new int [size+1]; > for ( int i = 0; i <= size; i++ ) parent[i] = -1; > return; > } > > //----------------------------------------- > int UFset::find(int i) > { > int j; > for ( j = i; parent[j] >= 0; j = parent[j]); > while ( i != j ) > { > int temp = parent[i]; > parent[i] = j; > i = temp; > } > return j; > } > > //------------------------------------------ > void UFset:: unionset(int root1,int root2) > { > int temp = parent[root1] + parent[root2]; > if ( parent[root2] < parent[root1] ) > { > parent[root1] = root2; > parent[root2] = temp; > } > else > { > parent[root2] = root1; > parent[root1] = temp; > } > return; > } > //======================================================= > > > > > int main() > { > // freopen("in.txt","r",stdin); > int n,i,j; > long long int d; > scanf("%d%LLd",&n,&d); > vector<co> data(n+1); > for( i=1;i<=n;i++) > scanf("%LLd%LLd",&data[i].x,&data[i].y); > vector<bool> pa(n+1,0); > UFset com(n); > char c; > int num1,num2; > while(scanf("%c",&c)==1) > { > if(c=='O') > { > scanf("%d",&num1); > pa[num1]=1; > for(j=1;j<=n;j++) > { > if(j==num1) continue; > long long int temp=(data[num1].x-data[j].x)*(data[num1].x-data[j].x)+(data[num1].y-data[j].y)*(data[num1].y-data[j].y); > if(temp<=d*d&&pa[j]) com.unionset(com.find(num1),com.find(j)); > } > } > else if(c=='S') > { > scanf("%d%d",&num1,&num2); > if(num1==num2) > { > if(pa[num1]) printf("SUCCESS\n"); else printf("FAIL\n"); > } > else if(com.find(num1)==com.find(num2)) printf("SUCCESS\n"); else printf("FAIL\n"); > } > } > > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator