zoukankan      html  css  js  c++  java
  • 并查集——poj2524(入门)

    传送门:Ubiquitous Religions

    • 许多次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
    ",kase++,ans);
        }
        return 0;
    } 
    View Code

    【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
    ",kase++,ans);
        }
        return 0;
    } 
    View Code

    【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
    ",kase++,ans);
        }
        return 0;
    } 
    View Code

    【AC】

    #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
    ",kase++,ans);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    effective C++
    bat取时间间隔
    bat设置windows计划任务
    listener.ora 与 tnsnames.ora
    route(windows)
    bat 数组实现
    非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)
    python no module named builtins
    Caffe使用新版本CUDA和CuDNN
    Ubuntu16.04安装vim8
  • 原文地址:https://www.cnblogs.com/xzxl/p/7337678.html
Copyright © 2011-2022 走看看