1 solutions

  • 0
    @ 2024-12-10 23:09:38

    C :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define maxn 10010
    
    int f[maxn];
    int vis[maxn];
    char G[maxn][maxn];
    int n, m;
    
    int find(int v){
    if(f[v]==v)return v;
    int F = find(f[v]);
    f[v] = F;
    return F;
    }
    
    
    int main()
    {
        while(scanf("%d%d",&n,&m) != EOF){
            for(int i = 0;i <= n; i++)f[i] = i;
            memset(vis,0,sizeof(vis));
            memset(G,0,sizeof(G));
            for(int i = 0;i < m; i++){
                int a, b, c;
                scanf("%d%d%d",&a,&b,&c);
                if(!a){
                    int fb = find(b);
                    int fc = find(c);
                    f[fc] = fb;
                }
                if(a){
                    G[c][b] = G[b][c] = 1;
                    int fb = find(b);
                    int fc = find(c);
                    for(int i = 1;i <= n; i++){
                        if(G[c][i] && i != b){
                            int f1 = find(i);
                            f[f1] = fb;
                        }
                    }
                    for(int i = 1;i <= n; i++){
                        if(G[b][i] && i != c){
                            int f1 = find(i);
                            f[f1] = fc;
                        }
                    }
                }
            }
            int ans = 0;
            for(int i = 1;i <= n; i++){
                int fa = find(i);
                vis[fa] = 1;
            }
            for(int i = 1;i <= n; i++){
                if(vis[i]){
                        ans++;
                }
            }
            printf("%d\n",ans);
        }
        return 0;
    }
    

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    int a[10500]={0},b[10500]={0};
    bool flag[10500];
    int n,m,sum=0;
    
    int find(int x);
    void zuhe(int x,int y);
    
    int main()
    {
    	memset(flag,0,sizeof(flag));
    	memset(b,0,sizeof(b));
    	
    	cin>>n>>m;
    	
    	for(int i=1;i<=n;++i)
    	{
    		a[i]=i;
    	}
    	
    	for(int i=1;i<=m;++i)
    	{
    		int p,x,y;
    		
    		cin>>p>>x>>y;
    		
    		if(p==0)
    		{
    			zuhe(x,y);
    		}
    		else
    		{
    			if(p==1)
    			{
    				if(b[x]==0)
    				{
    					b[x]=y;
    				}
    				else
    				{
    					zuhe(b[x],y);
    				}
    				
    				if(b[y]==0)
    				{
    					b[y]=x;
    				}
    				else
    				{
    					zuhe(b[y],x);
    				}
    				
    			}
    		}		
    	}
    	
    	for(int i=1;i<=n;++i)
    	{
    		flag[find(a[i])]=true;
    	}
    	
    	for(int i=1;i<=n;++i)
    	{
    		if(flag[i]==true) sum++;
    	}
    	
    	cout<<sum<<endl;
    }
    
    int find(int x)
    {
    	if(a[x]!=x)
    	{
    		a[x]=find(a[x]);
    	}
    	return a[x];
    }
    
    void zuhe(int x,int y)
    {
    	x=find(x);
    	y=find(y);
    	a[y]=x;
    }
    
    • 1

    Information

    ID
    582
    Time
    2000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By