zoukankan      html  css  js  c++  java
  • P1892 团伙

    朴素并查集

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #include<queue>
    using namespace std;
    int n,m;
    vector <int> dr[1001];
    int py[1001];
    int findpy(int x)
    {
        if(py[x]==x) return x;
        return py[x]=findpy(py[x]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          py[i]=i;
        for(int i=1;i<=m;i++)
        {
            int x,y;char p;
            cin>>p;
            scanf("%d%d",&x,&y);
    
            if(p=='F')
             if(findpy(x)!=findpy(y)) 
              py[findpy(y)]=findpy(x);
            else{
                dr[y].push_back(x);
                dr[x].push_back(y);//  双向 
            }
        }
    
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<dr[i].size();j++)
               py[findpy(dr[i][j])]=findpy(dr[i][0]);
        }
    
        int ans=0;
        for(int i=1;i<=n;i++)
         if(findpy(i)==i) ans++;
    
        printf("%d",ans);
        return 0;
    }

    反集这里写图片描述

    #include<iostream> 
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<algorithm>
    using namespace std;
    int f[3000];
    int find(int u)
    {
        //if(f[x]==x) return x;
        //return f[x]=find(f[x]);
    
        while(f[u]!=u)
        {
            u=f[u];
        }
        return f[u];
    }
    int main()
    {
        int n,m; 
        scanf("%d%d",&n,&m);
        for(int i=1;i<=2*n;i++) f[i]=i;
        for(int i=1;i<=m;i++)
        {
            int x,y;char p;
            cin>>p;
            scanf("%d%d",&x,&y);
    
            if(p=='F')
               if(find(x)!=find(y)) 
                 f[find(x)]=find(y);
            if(p=='E'){//else 不可以,匹配到最近的if
                if(find(x)!=find(y+n))
                  f[find(y+n)]=find(x);
                if(find(x+n)!=find(y))
                  f[find(x+n)]=find(y);
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
         //printf("%d ",f[i]);
         if(f[i]==i)      ans++;
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    【9303】平面分割
    【u114】旅行计划(12月你好)
    【u236】火炬
    【u233】单词化简
    Java Web整合开发(41) -- Forum
    1、服务器(软件)种类
    jquery trigger
    jQuery实现当按下回车键时绑定点击事件
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819766.html
Copyright © 2011-2022 走看看