2 条题解

  • 0
    @ 2025-11-14 19:17:03

    无向图联通问题 利用并查集解决

    def main():
        import sys
        #处理输入数据
        n, m, p = map(int, input().split())
        #创建存储列表
        line = [i for i in range(n + 1)]
        """先创建find_root函数 作用是利用递归查找父节点 查找是根源
        union函数会用到"""
        def find_root(x):
            if line[x] != x:
                line[x] = find_root(line[x])
            return line[x]#现在返回的就是父节点了
        #union函数是通过把两个同学的父节点变成一样的来让同学之间产生联系的
        def union(a, b):
            root_a, root_b = find_root(a), find_root(b)
            if root_a != root_b:
                line[root_a] = root_b
        #处理同学关系 
        for _ in range(m):
            a, b = map(int, sys.stdin.readline().strip().split())
            union(a, b)
        
        #进行父节点是否相同判断
        for _ in range(p):
            a, b = map(int, sys.stdin.readline().strip().split())
            if find_root(a) != find_root(b):
                print("No")
            else:
                print("Yes")
    if __name__ == "__main__":
        main()
    
    
      #无注释版本:
    
    ```python
    def main():
        import sys
        n, m, p = map(int, input().split())
        line = [i for i in range(n + 1)]
        
        def find_root(x):
            if line[x] != x:
                line[x] = find_root(line[x])
            return line[x]
        
        def union(a, b):
            root_a, root_b = find_root(a), find_root(b)
            if root_a != root_b:
                line[root_a] = root_b
         
        for _ in range(m):
            a, b = map(int, sys.stdin.readline().strip().split())
            union(a, b)
        
        for _ in range(p):
            a, b = map(int, sys.stdin.readline().strip().split())
            if find_root(a) != find_root(b):
                print("No")
            else:
                print("Yes")
    
    if __name__ == "__main__":
        main()
    
    • 0
      @ 2025-11-9 19:25:50

      并查集模板题,学完就会了并查集_OIWiki

      const int N=5e3+5;
      int fa[N];
      
      int find(int i){
          if(i!=fa[i]) fa[i]=find(fa[i]);
          return fa[i];
      }
      void join(int i,int j){
          int i_fa=find(i);
          int j_fa=find(j);
          fa[i_fa]=j_fa;
      }
      
      void solve(){
          for(int i=1;i<N;i++){
              fa[i]=i;
          }
          int n,m,p;cin>>n>>m>>p;
          for(int i=1;i<=m;i++){
              int x,y;cin>>x>>y;
              join(x,y);
          }
      
          for(int i=1;i<=p;i++){
              int x,y;cin>>x>>y;
              int fax = find(x);
              int fay = find(y);
              if(fax == fay) cout<<"Yes"<<endl;
              else cout<<"No"<<endl;
          }
      }
      
      • 1

      [2025 实验室三面] 来自理事长的委托!

      信息

      ID
      1123
      时间
      2000ms
      内存
      512MiB
      难度
      5
      标签
      递交数
      40
      已通过
      15
      上传者