zoukankan      html  css  js  c++  java
  • [Swust OJ 772]--Friend(并查集+map的运用)

    题目链接:http://acm.swust.edu.cn/problem/772/

    Time limit(ms): 1000        Memory limit(kb): 65535
      
    Description

    每个人都有朋友,朋友也有很多种,比如: 

    石友--情谊坚贞的朋友。 

    挚友--志同道合的朋友。

    益友--于己有帮助的朋友。

    网友--在互联网结识的朋友。

    闺友--闺房中无话不谈的朋友。

    君子交:指道义之交,即在道义上相互支持的朋友。

    竹马之交:少年时骑竹马为戏的朋友,指自幼相交的朋友,等等。

    现在dearway定义如果王二和张三是朋友,李四和张三也是朋友,那么王二和李四也是朋友,即朋友具有传递关系。现在给你N种朋友关系,问你有多种朋友集合,这些集合里不会出现两个朋友来自两个不同的集合。


     Input

    多组数据输入(小于等于10组)。每组数据第一行为一个整数N( 1 <= N <= 1000)表示N种朋友关系,接下来N行,每行首先输入一个整数ni( 1 <= ni <= 10)表示该种朋友关系中包含ni个人。然后ni个字符串,每个字符串由52个大小写英文字母及数字组成且长度小于10,表示ni个不同的人。 

    Output

    每组数据输出一行,表示满足要求的答案。 


     Sample Input

     
    4
    2 Hilary Dearway
    1 Hilary
    2 Rusty Serena
    2 Serena Luoxi
    10
    2 a b
    2 b c
    1 c
    3 a d e
    2 e f
    2 f g
    2 g h
    2 h i
    2 j k
    1 z

    Sample Output
    2
    3

     
     
    解题思路:一个并查集问题,每输入一个集合,朋友集合种类+1,然后并查集合并,看是否能合并到一个集合(种类-1),由于字符串不太好操作
         利用map强大的字符处理能力,把字符串一一对应成数字进行操作,具体的看代码吧~~~
     
    代码入下:
     1 #include<iostream>
     2 #include<map>
     3 #include<string>
     4 using namespace std;
     5 #define maxn 10001
     6 map<string, int>mpt;
     7 int father[maxn], ans, n, cnt, num;
     8 void init(){
     9     mpt.clear();
    10     cnt = ans = 0;
    11     for (int i = 0; i < maxn; i++)
    12         father[i] = i;
    13 }
    14 int findset(int x){
    15     return father[x] != x ? father[x] = findset(father[x]) : father[x];
    16 }
    17 void mergy(int a, int b){
    18     int x = findset(a), y = findset(b);
    19     if (x == y) return;
    20     else{
    21         father[x] = y;
    22         ans--;
    23     }
    24 }
    25 int main(){
    26     string s;
    27     while (cin >> n){
    28         init();
    29         for (int i = 1; i <= n; i++){
    30             int a, b;
    31             cin >> num >> s;
    32             if (!mpt[s]){
    33                 a = ++cnt;
    34                 mpt[s] = cnt;
    35                 ans++;
    36             }
    37             else a = mpt[s];
    38             for (int j = 1; j < num; j++){
    39                 cin >> s;
    40                 if (!mpt[s]){
    41                     b = ++cnt;
    42                     mpt[s] = cnt;
    43                     ans++;
    44                     mergy(a, b);
    45                 }
    46                 else{
    47                     b = mpt[s];
    48                     mergy(a, b);
    49                 }
    50             }
    51         }
    52         cout << ans << endl;
    53     }
    54     return 0;
    55 }
    View Code
     
  • 相关阅读:
    1.8(SQL学习笔记)触发器
    1.7(SQL学习笔记)游标
    1.6(SQL学习笔记)存储过程
    1.4(JavaScript学习笔记) window对象的属性及方法
    1.3 (JavaScript学习笔记)JavaScript对象
    1.2(JavaScript学习笔记)JavaScript HTML DOM
    1.1(JavaScript学习笔记)、JavaScript基础
    vuejs,router
    一个非常牛比的前端google插件
    vue.js 2.0开发(4)
  • 原文地址:https://www.cnblogs.com/zyxStar/p/4593296.html
Copyright © 2011-2022 走看看