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. javascript利用拷贝的方法实现导出excel(可以导出表格线)

    Js代码: <script language=javascript> function preview() { window.clipboardData.setData("Tex ...

  2. 深入浅出ES6(十七):展望未来

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 出于对文章长度的考虑,我们还保留了一些尚未提及的新特性,在最后的这篇文章中我会集 ...

  3. ExtJs之Ext.util.ClickRepeater

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  4. VISO下载地址

    http://pan.baidu.com/share/home?uk=4011207371#category/type=0

  5. iOS 应用内付费(IAP)开发步骤

    折腾好几天,原来是税务信息没有填写,哎...  国内就是好啊,没有这些麻烦的事情...  :) 等24小时,等税务的审核结果...     有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...

  6. Arraylist和Vector的区别与HashMap和Hashtable的区别

    1.ArrayList和HashMap都是线程异步的,所以它们的特点是效率高,但是安全性低: 2.Vector和Hashtable都是线程同步的,所以它们的特点是效率低,但是安全性高.

  7. eclipse导入maven项目后依赖jar包更新问题->update project按钮

    eclipse导入maven项目后依赖jar包更新问题 1.eclipse有专门的导入maven项目按钮,file-import-maven project,eclipse会自动查找指定路径下的pom ...

  8. JavaWeb项目开发案例精粹-第4章博客网站系统-002辅助类及配置文件

    1. <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5&qu ...

  9. 虚拟机WindowServer2003共享文件夹

    前话 之前我写过虚拟机装SQL Server的博文,也许有同学参考了也通过虚拟机装数据库服务来做实验作业了. 到了第二章节学习时,实验要求数据库导出Excel文件,这样一来就出现了小问题了,Windo ...

  10. MyBatis学习总结_15_定制Mybatis自动代码生成的maven插件

    ==================================================================================================== ...