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:我写个并查集,为啥会超内存,不解啊 Posted by:hataksumo at 2013-02-17 15:19:05 #include<cstdio> #include<cstring> #define MM 250 int m,r; int father[MM*2]; struct { int left; int right; int rank; }roots[MM*2]; void iniUnionSet() { int i; int m2 = m*2; for(i=1;i<=m2;i++) { father[i] = i; roots[i].left = i<=m; roots[i].right = i>m; roots[i].rank = 1; } } int find(int x) { if(father[x]!=x) father[x] = find(father[x]); return father[x]; } void merge(int x,int y) { int fx = find(x); int fy = find(y); if(fx==fy)return; if(roots[fx].rank>=roots[fy].rank) { father[fy] = fx; roots[fx].left+=roots[fy].left; roots[fx].right += roots[fy].right; roots[fx].rank += roots[fy].rank; } else { father[fx] = fy; roots[fy].left += roots[fx].left; roots[fy].right += roots[fx].right; roots[fy].rank += roots[fx].rank; } } struct { int left; int right; }group[MM*2]; int groupLen; void grouping() { int i,m2=m*2; groupLen = 0; for(i=1;i<=m2;i++) { if(i==father[i]) { group[groupLen].left = roots[i].left; group[groupLen].right = roots[i].right; groupLen++; } } } void readData() { int xi,yi; iniUnionSet(); while(r--) { scanf("%d%d",&xi,&yi); merge(xi,yi+m); } grouping(); } bool dp[MM][MM]; struct position { int x; int y; }; position feasible[MM*MM],future[MM*MM]; int fsLen,ftLen; void dpProcess() { int i,j; int nx,ny,m2=m/2; memset(dp,false,sizeof(dp)); fsLen = ftLen =0; dp[0][0] = true; feasible[fsLen].x = 0; feasible[fsLen].y = 0; fsLen++; for(i=0;i<groupLen;i++) { ftLen = 0; for(j=0;j<fsLen;j++) { nx = feasible[j].x + group[i].left; ny = feasible[j].y + group[i].right; if(nx<=m2&&ny<=m2&&dp[nx][ny]==false) { dp[nx][ny] = true; future[ftLen].x = nx; future[ftLen].y = ny; ftLen++; } } for(j=0;j<ftLen;j++) { feasible[fsLen].x = future[j].x; feasible[fsLen].y = future[j].y; fsLen++; } } } void solve() { int m2 = m/2; while(m2) { if(dp[m2][m2]) { printf("%d\n",m2); break; } m2--; } } int main() { int css; scanf("%d",&css); while(css--) { scanf("%d%d",&m,&r); readData(); dpProcess(); solve(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator