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

    2597 团伙

     

    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 黄金 Gold
     
     
     
     
    题目描述 Description

    1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:

    我朋友的朋友是我的朋友;

    我敌人的敌人也是我的朋友。 

    两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。

    输入描述 Input Description

    输入文件gangs.in的第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。 第二行M(1<=M<=5000),表示关于强盗的信息条数。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。输入数据保证不会产生信息的矛盾。

    输出描述 Output Description

    输出文件gangs.out只有一行,表示最大可能的团伙数。

    样例输入 Sample Input

    6
    4
    E 1 4
    F 3 5
    F 4 6
    E 1 2

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    2<=N<=1000

    1<=M<=5000

    1<=p q<=N

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int map[5001][5001];
     6 int fa[5001];
     7 /*int find(int x)
     8 {
     9     if(fa[x]!=x) return fa[x]=find(fa[x]);
    10     else return x;
    11 }*/
    12 int find(int x)
    13 {
    14     int r;
    15     r=x;
    16     while (fa[r]!=r) r=fa[r];
    17     return r;
    18     if(fa[x]!=x)return fa[x]=find(fa[x]);
    19 }
    20 int main()
    21 {
    22     memset(map,0,sizeof(map));
    23     int n,m;
    24     cin>>n>>m;
    25     char c;
    26     int x,y;
    27     for(int i=1;i<=n;i++)
    28      {
    29          fa[i]=i;
    30      }
    31     for(int i=1;i<=m;i++)
    32      {
    33          cin>>c>>x>>y;
    34          if(c=='F')
    35           {
    36               int r=find(x);
    37               int rr=find(y);
    38               fa[rr]=r;
    39           }
    40          if(c=='E')
    41           {
    42               for(int i=1;i<=map[x][0];i++)
    43                {
    44                    int r=find(y);
    45                    int rr=find(map[x][i]);
    46                    fa[r]=rr;
    47                }
    48                for(int i=1;i<=map[y][0];i++)
    49                 {
    50                     int r=find(x);
    51                     int rr=find(map[y][i]);
    52                     fa[r]=rr;
    53                 }
    54                 map[x][0]++,map[y][0]++;
    55                 map[x][map[x][0]]=y;
    56                 map[y][map[y][0]]=x;
    57            } 
    58      }
    59      int tot=0;
    60      for(int i=1;i<=n;i++)
    61       {
    62           if(find(i)==i)
    63            {
    64                tot++;
    65            }
    66       }
    67       cout<<tot;
    68       return 0;
    69 }
  • 相关阅读:
    探讨.net Socket支持在线连接数量
    Net Configuration Agent
    Http压力测试工具HttpTest4Net
    TCP连接有效性检测方法
    SocketAsyncEventArgs使用解说
    可靠、高吞吐架构基础改造
    PerformanceCounter蛋痛的设计
    谱聚类(spectral clustering)原理总结
    用scikit-learn学习DBSCAN聚类
    DBSCAN密度聚类算法
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6700829.html
Copyright © 2011-2022 走看看