3 solutions

  • 0
    @ 2023-2-1 21:40:57

    并查集模板 需要判断集合数

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e3+7;
    int fa[N]; 
    int x,y,u,v;
    void init(){//初始化,每个数看成一个集合
    	for(int i=1;i<=N;i++) fa[i]=i;
    }
    int find(int x){   //这里不能用路劲压缩
       if(x==fa[x]) return x;
       else return find(fa[x]); 
    }
    void merge(int x,int y)//合并
    {
    	u=find(x);
    	v=find(y);
    	if(u!=v) fa[u]=v;
    }
    int main(){
    	int n,m,x,y;
    	while(~scanf("%d%d",&n,&m)&n){
    		init();  //注意位置
    		for(int i=0;i<m;i++){
    			scanf("%d%d",&x,&y);
    			 merge(x,y);
    		}
    		int sum=0;
    		for(int i=1;i<=n;i++){ //已经连通的村庄整体算一个集合
    			if(i==fa[i]) sum++;//!!!
    		}
            printf("%d\n",sum-1);//n个集合可以看成n个点,连通至少需要n-1条边
    	}
    }
    

    Information

    ID
    1258
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    5
    Tags
    # Submissions
    110
    Accepted
    44
    Uploaded By