5 solutions

  • 2
    @ 2024-5-17 19:47:04

    思路

    用并查集找公共祖先,需要压缩路径。

    int find(int x){
    	if (x == fa[x])	return x;
    	return fa[x] = find(fa[x]);
    }
    
    void merge(int x,int y){
    	fa[find(y)] = find(x);
    }
    

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 20005,M = 1000005,Q = 1000005;
    int a[N];
    int find(int x){
    	if (x == a[x])	return x;
    	return a[x] = find(a[x]);
    }
    void merge(int x,int y){
    	a[find(y)] = find(x);
    }
    int main(int argc, char **argv){
    	for (int i = 0;i < N;i++)	a[i] = i;
    	int n,m,q;
    	cin >> n >> m;
    	for (int i = 0;i < m;i++){
    		int x,y;
    		scanf("%d %d",&x,&y);
    		merge(x,y);
    	}
    	cin >> q;
    	for (int i = 0;i < q;i++){
    		int c,d;
    		scanf("%d %d",&c,&d);
    		if(find(c) == find(d))	printf("Yes\n");
    		else	printf("No\n");
    	}
    	return 0;
    }
    
    • 1
      @ 2024-5-19 12:19:53
      #include<bits/stdc++.h>
      using namespace std;
      const int MAX_A=2e4+10;
      int d[MAX_A];
      int find(int x){
          if(x==d[x]){
              return x;
          }
          return d[x]=find(d[x]);
      }
      void add(int x,int y){
          d[find(x)]=find(y);
      }
      int main(){
          ios::sync_with_stdio(0);
          cin.tie(0),cout.tie(0);
          int n,m,q;
          cin>>n>>m;
          for(int i=1;i<=n;i++) d[i]=i;
          for(int i=0;i<m;i++){
              int a,b;
              cin>>a>>b;
              add(a,b);
          }
          cin>>q;
          while(q--){
              int a,b;
              cin>>a>>b;
              if(find(a)==find(b)) cout<<"Yes\n";
              else cout<<"No\n";
          }
          
          return 0;
      }
      
      • 1
        @ 2024-5-17 19:30:52

        歹马: 注意:输入数据多,要用scanf和printf

        #include<bits/stdc++.h>
        using namespace std;
        const int MAX_A=2e4+10;
        int d[MAX_A];
        int find(int x){
            if(x==d[x]){
                return x;
            }
            return d[x]=find(d[x]);
        }
        void add(int x,int y){
            d[find(x)]=find(y);
        }
        int main(){
            ios::sync_with_stdio(0);
            cin.tie(0),cout.tie(0);
            int n,m,q;
            cin>>n>>m;
            for(int i=1;i<=n;i++) d[i]=i;
            for(int i=0;i<m;i++){
                int a,b;
                cin>>a>>b;
                add(a,b);
            }
            cin>>q;
            while(q--){
                int a,b;
                cin>>a>>b;
                if(find(a)==find(b)) cout<<"Yes\n";
                else cout<<"No\n";
            }
            
            return 0;
        }
        
        • 1
          @ 2024-5-17 19:28:58

          思路

          不要使用没解绑的cin,cout

          不然,81TLE

          代码

          #include<iostream>
          using namespace std;
          int n,m,q;
          int fa[114514];
          int find(int x)//找祖先
          {
              if(fa[x]==x)
                  return x;
              return fa[x]=find(fa[x]);
          }
          void hb(int x,int y)//合并
          {
              fa[find(x)]=find(y);
          }
          int main()
          {
              scanf("%i%i",&n,&m);
              for(int i=1;i<=n;i++)
              {
                  fa[i]=i;//初始化
              }
              for(int i=1;i<=m;i++)
              {
                  int u,v;
                  scanf("%i%i",&u,&v);
                  hb(u,v);//合并
              }
              cin>>q;
              while(q--)
              {
                  int u,v;
                  scanf("%i%i",&u,&v);
                  if(find(u)==find(v))//查看祖先是否相同
                  {
                      printf("Yes\n");
                  }
                  else
                  {
                      printf("No\n");
                  }
              }
              return 0;//完结散花
          }
          
          • 0
            @ 2024-5-17 19:28:44
            using namespace std;
            int f[20001],n,m;
            int find(int x){
            if(f[x]==x){
            return x;
            }
            else{
            f[x]=find(f[x]);
            return f[x];
            }
            }
            void merge(int x,int y){
            f[find(x)]=find(y);
            }
            int main(){
            ios::sync_with_stdio(0);
            cin.tie(0),cout.tie(0);
            cin>>n>>m;
            for(int i=1;i<=n;i++){
            f[i]=i;
            }
            for(int i=1;i<=m;i++){
            int a,b;
            cin>>a>>b;
            merge(a,b);
            }
            int q;
            cin>>q;
            for(int i=1;i<=q;i++){
            int c,d;
            cin>>c>>d;
            if(find(c)==find(d)){
            cout<<"Yes"<<endl;
            }
            else{
            cout<<"No"<<endl;
            }
            }
            }
            
            • 1

            Information

            ID
            831
            Time
            1000ms
            Memory
            256MiB
            Difficulty
            6
            Tags
            # Submissions
            87
            Accepted
            29
            Uploaded By