1 条题解

  • 0
    @ 2025-4-7 21:19:28

    C :

    #include <stdio.h>
    
    int total;
    int pre[1001];
    
    void init(int n){
    	int i;
    	for(i=1;i<=n;++i){
    		pre[i] = i;
    	}
    }
    
    int root(int x){
    
    	if(x!=pre[x]){
    		pre[x] = root(pre[x]);
    	}
    	return pre[x];
    }
    
    void merge(int a,int b){
    
    	int x = root(a);
    	int y = root(b);
    	if(x!=y){
    		pre[x]=y;
    		--total;
    	}
    }
    
    int main(){
    	int N,M,i,st,end;
    	while(scanf("%d",&N) && N){
    		
    		scanf("%d",&M);
    
    		init(N);
    
    		total = N-1;
    
    		for(i=0;i<M;++i){
    			scanf("%d %d",&st,&end);
    			merge(st,end);
    		}
    		printf("%d\n",total);
    	}
    	return 0;
    }
    
    

    C++ :

    #include<stdio.h>
    
    int p[1000];
    
    int Find(int i)
    {
    	return i==p[i]?i:p[i]=Find(p[i]);
    }
    
    void Union(int a,int b)
    {
    	p[a]=b;
    }
    
    int main()
    {
    	int n,m,i,s,e,a,b,ans;
    	while(scanf("%d",&n)!=EOF,n)
    	{
    		scanf("%d",&m);
    		for(i=1;i<=n;i++)
    			p[i]=i;
    		while(m--)
    		{
    			scanf("%d%d",&s,&e);
    			a=Find(s);
    			b=Find(e);
    			if(a!=b)
    				p[a]=b;
    		}
    		for(ans=0,i=1;i<=n;i++)
    			if(p[i]==i)
    				ans++;
    		printf("%d\n",ans-1);
    	}
    	return 0;
    }
    

    Pascal :

    var
      father:array[1..1000]of longint;
    	i,j,n,q,ans,x,y:longint;
    function search(x:longint):longint;
    begin
      if father[x]<>x then father[x]:=search(father[x]);
      exit(father[x]);
    end;
    procedure judge(x,y:longint);
    var a,b:longint;
    begin
      a:=search(x); b:=search(y);
      if a<>b then father[b]:=a;
    end;
    begin
      read(n);
      while n<>0 do begin
          read(q);
    	for i:=1 to n do father[i]:=i;
    	for i:=1 to q do begin
    	  read(x,y);
    		judge(x,y);
    	end;
    	ans:=0;
    	for i:=1 to n do
    	  if father[i]=i then inc(ans);
    	writeln(ans-1);
            read(n);
            end;
    end.
    

    Java :

    
    import java.util.Scanner;
    public class Main{
    	static int m,n;
    	static int ans=0;
    	static int a[]=new int[1000010];
    	static int[]pre=new int[1000010];
    	static void init() {
    		for(int i=0;i<=m;i++) {
    			pre[i]=i;
    		}
    	}
    	static int find(int x) {
    		if(pre[x]==x) return x;
    		return pre[x]=find(pre[x]);
    	}
    	static void join(int x,int y) {
    		int fx=find(x);
    		int fy=find(y);
    		if(fx!=fy) {
    			pre[fx]=fy;
    		}
    	}
    	static boolean judge(int x,int y) {
    		return find(x)==find(y);
    	}
    	public static void main(String[]args) {
    		Scanner sc=new Scanner(System.in);
    		while(true) {
    			for(int i=0;i<=m;i++) a[i]=0;
    		m=sc.nextInt();
    		if(m==0)break;
    		init();
    		n=sc.nextInt();
    		for(int i=0;i<n;i++) {
    			int u=sc.nextInt();
    			int v=sc.nextInt();
    			join(u, v);
    		}for(int i=1;i<=m;i++) {
    			a[find(i)]=-1;
    			if(a[i]!=-1) ans++;
    		}System.out.println(m-ans-1);
    		ans=0;
    	}
    	}
    }
    
    • 1

    信息

    ID
    1136
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者