HDU 4619 Warm up 2 (并查集)
2014-03-27 12:21
330 查看
/* 并操作保证了没有环,n个元素组成的链只要去掉n/2个元素就不会相连 */ #include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; int f[2010]; int cnt[2010]; int mfind(int x) { if(f[x]!=x)f[x]=mfind(f[x]); return f[x]; } void make(int a,int b) { int f1=mfind(a); int f2=mfind(b); if(f1!=f2) { f[f2]=f1; cnt[f1]+=cnt[f2]; } } int main() { int n,m,i,j; vector<int>g[110][110];; while(cin>>n>>m&&(n+m)) { int N=n+m; for(i=0;i<N;i++){ f[i]=i; cnt[i]=1; } for(i=0;i<101;i++) { for(j=0;j<101;j++)g[i][j].clear(); } int x,y; for(i=0;i<n;i++) { cin>>x>>y; g[x][y].push_back(i); g[x+1][y].push_back(i); } for(i=n;i<N;i++) { cin>>x>>y; g[x][y].push_back(i); g[x][y+1].push_back(i); } for(i=0;i<101;i++) { for(j=0;j<101;j++) { if(g[i][j].size()==2) { make(g[i][j][0],g[i][j][1]); } } } int ans=0; for(i=0;i<N;i++){ if(f[i]==i){ if(cnt[i]==1)ans+=1; else ans+=cnt[i]-cnt[i]/2; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 4619 Warm up 2(并查集)
- hdu 4619 Warm up 2(并查集)
- hdu 4619 Warm up 2(并查集)
- HDU 4619 Warm up 2(贪心、并查集 | 二分图最大独立集)
- hdu 4619 warm up 2 并查集或搜索都可以做出来的题 2013多校联合训练第二场
- hdu 4619 Warm up 2(并查集活用)
- hdu 4619 Warm up 2 网络流 最小割
- HDU 4619 Warm up 2 (二分图最小覆盖集)
- HDU 4619 Warm up 2(最大独立集)
- HDU - 4619 I - Warm up 2
- hdu 4619 Warm up 2_最大独立集
- hdu 4619 Warm up 2
- hdu 4619 Warm up 2_最大独立集
- HDU 4619 Warm up 2 (2013 多校第二场) - from lanshui_Yang
- HDU 4619 Warm up 2 最大独立集
- hdu 4619 Warm up 2(二分图最大匹配)
- HDU 4619 Warm up 2 解题报告
- HDU 4619 Warm up 2
- HDU 4619 Warm up 2
- HDU 4619 Warm up 2(最大流或二分匹配)