zoukankan      html  css  js  c++  java
  • bzoj 1370 Gang团伙

    题目大意:

    在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,满足

    1、 我朋友的朋友是我的朋友

    2、 我敌人的敌人是我的朋友

    所有是朋友的人组成一个团伙 告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,计算出这个城市最多可能有多少个团伙

    思路:

    对于每个人用两个点表示

    一个点所在集合表示这个人的朋友所在集合

    另一点所在结婚表示这个人的敌人所在集合

    然后并查集即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<cstdlib>
     6 #include<cstring>
     7 #include<queue>
     8 #include<map>
     9 #include<vector>
    10 #define ll long long
    11 #define inf 2147483611
    12 #define MAXN 1010
    13 using namespace std;
    14 inline int read()
    15 {
    16     int x=0,f=1;char ch=getchar();
    17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    19     return x*f;
    20 }
    21 int n,f[MAXN*2],ans;
    22 bool hsh[MAXN*2];
    23 int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}
    24 int main()
    25 {
    26     n=read();
    27     int Q=read(),a,b,fa,fb;char ch[3];
    28     for(int i=1;i<=2*n;i++) f[i]=i;
    29     while(Q--)
    30     {
    31         scanf("%s",ch);a=read(),b=read();
    32         if(ch[0]=='E')
    33         {
    34             fa=find(a+n),fb=find(b);
    35             if(fa!=fb) f[fa]=fb;
    36             fa=find(a),fb=find(b+n);
    37             if(fa!=fb) f[fa]=fb;
    38         }
    39         else
    40         {
    41             fa=find(a),fb=find(b);
    42             if(fa!=fb) f[fa]=fb;
    43         }
    44     }
    45     for(int i=1;i<=n;i++)
    46     {
    47         a=find(i);
    48         if(!hsh[a]) hsh[a]=1,ans++;
    49     }
    50     printf("%d",ans);
    51 }
    52 
    View Code
  • 相关阅读:
    线性表
    文件IO其四 图片显示
    文件IO其三 目录操作
    文件IO其二 文件IO
    文件IO其一 标准IO
    字符串处理函数
    复杂类型及编译相关
    linux内存分析
    构建根文件系统3-完善根文件系统
    构建根文件系统3-构建最小根文件系统
  • 原文地址:https://www.cnblogs.com/yyc-jack-0920/p/7861133.html
Copyright © 2011-2022 走看看