[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 }

时间: 2024-11-08 19:49:55

[Swust OJ 772]--Friend(并查集+map的运用)的相关文章

swust oj 856--Huge Tree(并查集)

题目链接:http://acm.swust.edu.cn/problem/856/ Time limit(ms): 1000 Memory limit(kb): 10000 There are N trees in a forest. At first, each tree contains only one node as its root. And each node is marked with a number. You're asked to do the following two

【日常学习】【并查集+map】codevs2639 约会计划题解

然而我居然让诸城一中悲剧机房的C++可以编译了··· 直接上题目 题目描写叙述 Description cc是个超级帅哥,口才又好.rp极高(这句话似乎降rp),又非常的幽默,所以非常多mm都跟他关系不错. 然而.最关键的是,cc可以非常好的调解各各妹妹间的关系.mm之间的关系及其复杂.cc必须严格掌握她们之间的朋友关系,好一起约她们出去,cc要是和不是朋友的两个mm出去玩.后果不堪设想-- cc仅仅掌握着一些mm之间的关系.可是cc比較聪明.他知道a和b是朋友,b和c 是朋友,那么a和c也是朋

杭电3172--Virtual Friends(并查集+map)

Virtual Friends Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6844    Accepted Submission(s): 1952 Problem Description These days, you can do all sorts of things online. For example, you can u

hdu 3172 并查集+map

/*这里将fa[]数组初始化为-1比较方便 输入格式有点坑 看的讨论*/ 1 #include "cstdio" 2 #include "iostream" 3 #include "cstring" 4 #include "vector" 5 #include "queue" 6 #include "map" 7 #include "string" 8 #includ

Virtual Friends(并查集+map)

Virtual Friends Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 70   Accepted Submission(s) : 29 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description These days, you can d

NBUT 1451 Elise (map +并查集)

[1451] Elise 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Elise is the Spider Queen. She has a skill, Spider Form(蜘蛛形态). When she transformed to the spider, there will be some small spiders around her. But she has a problem - the small spiders will have infighti

swust oj 1091--土豪我们做朋友吧(并查集,最值维护)

题目链接:http://acm.swust.edu.cn/problem/1091/ Time limit(ms): 1000 Memory limit(kb): 32768 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个种类,1:A和B成为了朋友,并且A的所有朋友都成了B的朋友,B的所有朋友也都成了A的朋友.2:A缺钱了,请求帮助,他需要向他朋友中钱最多的请求帮助,若不止一位,选择编

并查集练习(0743) SWUST OJ

#include<iostream> #include<cstring> using namespace std; int a[1000005]; int n,m,l,ci,di; int root(int x) //找到根节点 { int r = x; while(r != a[r]) r = a[r]; int i = x,j; while(i != r) //压缩路径 { j = a[i]; a[i] = r; i = j; } return r; } void mix(in

hihoCoder - 1066 - 无间道之并查集 (并查集 + map)

#1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息--额,说远了,总之,小Hi和小Ho决定趁着这朗朗春光出去玩. 但是刚刚离开居住的宾馆不久,抄近道不小心走入了一条偏僻小道的小Hi和小Ho就发现自己的前方走来了几个彪形大汉,定睛一看还都是地地道道的黑人兄弟!小Hi和小Ho这下就慌了神,捡肥皂事小,这一身百把来斤别一不小心葬身他乡可就没处说去了. 就在两人正举足无措之时,为首的黑叔叔