Problem Description

娜娜好不容易才回忆起自己是娜娜而不是什么Alice,也回忆起了自己要继续探索这个世界的目标,便偷偷溜出皇宫。娜娜发现这个王国有很多个民族组成,每个民族都有自己的方言,更要命的是这些方面差别还很远,这就导致这个王国的人民交流十分困难。娜娜仔细观察并记录了好久,发现总共有m种不同的语言。

突然娜娜发现前面有一群天才在讨论问题,但是奈何语言问题,导致这群人交流非常吃力。不过幸亏的是,这群天才都有一个特殊的能力,只要消耗一个单位的能量即可完全领悟一门新的语言(妈妈再也不用担心我的四六级托福雅思GRE!)。于是娜娜久违的的好奇心又开始冒泡了,娜娜希望你告诉她,如果知道了每个人会的语言,是否能让这群天才两两直接或者间接的交流呢?所谓间接得交流是指经过若干个人的翻译使两个人得到相互表达的信息。如果不能,至少需要多少能量才能实现呢?

Input

多组数据,首先是一个正整数t(t<=20)

对于每组数据,首先是两个整数n,m(2<=n<=100,1<=m<=100),分别代表人数以及语言的种类数,语言的编号从1~m。

接下来是n行,每行对这个人进行描述

首先是一个整数k,表示这个人已经会k门语言,接下来是k个整数,分别是这个人掌握的语言编号。(0<=k<=m)

Output

对于每组数据,输出一个整数,表示使得这群人能够互相直接或者间接交流所需要的最少能量。

Sample Input

2
2 2
1 2
0
5 5
1 2
2 2 3
2 3 4
2 4 5
1 5

Sample Output

1
0

Hint

样例1中其中第一个人会第二种语言,而第二个人不会任何语言,所以只需要第二个人也学会第二种语言即可交流,所以能量数为1

样例2中有5个人,而且这5个人已经可以相互直接或间接进行交流: 1-2-3-4-5,正好构成一条链。因此不需要继续学习新的语言,能量数为0。

题意:有一群人,每个人分别会c种语言(c>=0),问题是,要让他们都可以互相交流(可以通过其他人翻译,只需要把话讲给能听懂你的话的人,让他代你传达)。问,如果消耗1点能量可以让某个人学会一种语言,那么要消耗多少能量能让他们都能交流?

思路:数据也是比较小的,直接就BFS了,维护两个表,一个是靠语言编号来索引的表,表示会这种语言的人。一个是靠人的编号来索引的表,表示这个人会的语言。从第一人开始扯出所有有联系的人,从该人索引到他会的语言,用这些语言索引所有会此语言的人,全部拖出,将这些人置为浏览过。如果还有剩下的人,肯定是联系不到的了。其实就是求有多少个连通分量,但是此题没有给直接的图,而是给出他们所会的语言,不方便用并查集,如果耗时去全部搜一遍来建立邻接表,何不如直接搜一遍得出答案。

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
vector< vector<int> > lang;
vector< vector<int> > peop; bool vis[N];
int t, n, m, num, c; void DFS(int e)
{
for(int i=; i<peop[e].size(); i++) //所会的语言
{
int r=peop[e][i];
for(int j=; j<lang[r].size(); j++) //会该语言的所有人都是朋友
{
int w=lang[r][j]; //会r语言的人
if( !vis[w] )
{
vis[w]=true;
DFS(w);
}
}
}
} int cal()
{
int cnt=-;
memset(vis,,sizeof(vis));
for(int i=; i<=n; i++) //每个人
{
if(peop[i].empty()) //这些人都不会讲话
{
vis[i]=true;
continue;
}
if(!vis[i])
{
vis[i]=true;
cnt++;
DFS(i); //暴力灭它9族
}
}
return max(cnt,); //总不能为负吧!
} int main()
{
//freopen("e://input.txt", "r", stdin);
vector<int> tmp;
cin>>t;
while(t--)
{
int cnt=; //这些人必须学会一种语言
peop.clear();lang.clear();
scanf("%d%d",&n,&m);
for(int i=; i<=(n>m?n:m); i++) peop.push_back(tmp),lang.push_back(tmp);//初始化
for(int i=; i<=n; i++) //每个人
{
scanf("%d",&num);
if(!num) cnt++; //注意坑在这:假如有两个人,都不会任何语言,那么他们必须学会一种,即2点能量,而不是1。
for(int j=; j<num; j++) //会的语言
{
scanf("%d",&c);
lang[c].push_back(i); //会c语言的人
peop[i].push_back(c); //第i人会的语言
}
}
cout<<cal()+cnt<<endl;
}
return ;
}

AC代码

acdream 1685 多民族王国(DFS,并查集)的更多相关文章

  1. 分珠(dfs+并查集)

    1140 分珠 时间限制:500MS  内存限制:65536K提交次数:24 通过次数:18 题型: 编程题   语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不 ...

  2. Codeforces 1027D Mouse Hunt (强连通缩点 || DFS+并查集)

    <题目链接> 题目大意: 有n个房间,每个房间都会有一只老鼠.处于第i个房间的老鼠可以逃窜到第ai个房间中.现在要清理掉所有的老鼠,而在第i个房间中防止老鼠夹的花费是ci,问你消灭掉所有老 ...

  3. CodeForces - 455C Civilization (dfs+并查集)

    http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...

  4. PAT甲题题解-1021. Deepest Root (25)-dfs+并查集

    dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...

  5. hdu 1198 Farm Irrigation(深搜dfs || 并查集)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  6. 1021. Deepest Root (25)——DFS+并查集

    http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...

  7. CF 115 A 【求树最大深度/DFS/并查集】

    CF A. Party time limit per test3 seconds memory limit per test256 megabytes inputstandard input outp ...

  8. 51nod1307(暴力树剖/二分&dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  9. ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集

    Untrusted Patrol Time Limit: 3 Seconds                                     Memory Limit: 65536 KB    ...

随机推荐

  1. android自动化环境搭建

    android自动化环境安装指南 1.appium相关安装(eclipse下)见http://www.cnblogs.com/wangcp-2014/p/5717589.html参考selenium的 ...

  2. 关于yum仓库的中的软件包下载

    在Linux系统下,很多软件的安装我们都会选择使用yum的方式安装,因为简单方便,易于管理. 有时我们可能会有这样的一个需求:即喜欢上yum仓库中的一个软件了,想要下载到本地.该怎么办呢? 实现方法不 ...

  3. lintcode: 最长连续序列

    最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度. 说明 要求你的算法复杂度为O(n) 样例 给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3 ...

  4. 有N个大小不等的自然数(1--N),请将它们由小到大排序。要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。

    #include<stdio.h> int main() { ]={,,,,,,,,}; int i,tmp; ;i<;i++) { ) { tmp=a[i]; a[i]=a[a[i ...

  5. ActiveMQ和Tomcat的整合应用(转)

    转自:http://topmanopensource.iteye.com/blog/1111321 ActiveMQ和Tomcat的整合应用 博客分类: ActiveMQ学习和研究   在Active ...

  6. MySql对空间数据库的支持

    地址: MySQL5.1中文在线API:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/spatial-extensions-in-mysq ...

  7. 调试EF源代码环境配置

    下载EF6的源代码,运行build编译,Nuget会自动下载所需的DLL. 打开EF的工程,可以在EF解决方案下直接新建调试用的项目代码 添加EF引用时选择解决方案中的Entity Framework ...

  8. Bootstrap plugin编写

    滚动demo: <!doctype html> <html lang="en"> <head> <meta charset="U ...

  9. django 外键 ,django __

    data sqlite> select * from author; id name age 1 jim 12 2 tom 11 sqlite> select * from book; i ...

  10. OSX 升级 vim

    善用 Homebrew 神器啊,少年!Homebrew - The missing package manager for OS X安装完成后打开终端输入: brew install vim --wi ...