并查集——poj2524(入门)
- 许多次WA,贴上错的代码随时警示
- 简单没多加修饰的并查集
【WA1】
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 50005; int n,m; int a,b,ans; int pre[maxn]; void init() { for(int i=1;i<=n;i++){ pre[i] = i; } } int findPre(int x){ if(x==pre[x]) return x; findPre(pre[x]); } bool isSame(int x,int y) { if(findPre(x)==findPre(y)) return true; return false; } void unite(int x,int y) { pre[y] = x; //y的上级变为x的祖先节点 } int main() { int kase = 1; while(scanf("%d%d",&n,&m)==2 && !(n==0&&m==0)){ init(); ans = 0; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); unite(a,b); } for(int i=1;i<=n;i++){ if(i==pre[i]) ans++; } printf("Case %d: %d\n",kase++,ans); } return 0; }
【WA2】
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 50005; int n,m; int a,b,ans; int pre[maxn]; void init() { for(int i=1;i<=n;i++){ pre[i] = i; } } int findPre(int x){ if(x != pre[x]){ pre[x] = findPre(pre[x]); } return pre[x]; } bool isSame(int x,int y) { if(findPre(x)==findPre(y)) return true; return false; } void unite(int x,int y) { pre[y] = x; //y的上级变为x的祖先节点 } int main() { int kase = 1; while(scanf("%d%d",&n,&m)==2 && !(n==0&&m==0)){ init(); ans = 0; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); unite(a,b); } for(int i=1;i<=n;i++){ if(i==pre[i]) ans++; } printf("Case %d: %d\n",kase++,ans); } return 0; }
【WA3】
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 50005; int n,m; int a,b,ans; int pre[maxn]; void init() { for(int i=1;i<=n;i++){ pre[i] = i; } } int findPre(int x){ if(x==pre[x]) return x; findPre(pre[x]); } bool isSame(int x,int y) { if(findPre(x)==findPre(y)) return true; return false; } void unite(int x,int y) { x = findPre(x); y = findPre(y); if(x==y) return; ans--; pre[y] = x; //y的上级变为x的祖先节点 } int main() { int kase = 1; while(scanf("%d%d",&n,&m)==2 && !(n==0&&m==0)){ init(); ans = n; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); unite(a,b); } printf("Case %d: %d\n",kase++,ans); } return 0; }
【AC】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 50005; int n,m; int a,b,ans; int pre[maxn]; void init() { for ( int i=1;i<=n;i++){ pre[i] = i; } } int findPre( int x){ if (x != pre[x]){ pre[x] = findPre(pre[x]); } return pre[x]; } bool isSame( int x, int y) { if (findPre(x)==findPre(y)) return true ; return false ; } void unite( int x, int y) { x = findPre(x); y = findPre(y); if (x==y) return ; ans--; pre[y] = x; //y的上级变为x的祖先节点 } int main() { int kase = 1; while ( scanf ( "%d%d" ,&n,&m)==2 && !(n==0&&m==0)){ init(); ans = n; for ( int i=1;i<=m;i++){ scanf ( "%d%d" ,&a,&b); unite(a,b); } printf ( "Case %d: %d\n" ,kase++,ans); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步