acdream 1685 多民族王国(DFS,并查集)
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,并查集)的更多相关文章
- 分珠(dfs+并查集)
1140 分珠 时间限制:500MS 内存限制:65536K提交次数:24 通过次数:18 题型: 编程题 语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不 ...
- Codeforces 1027D Mouse Hunt (强连通缩点 || DFS+并查集)
<题目链接> 题目大意: 有n个房间,每个房间都会有一只老鼠.处于第i个房间的老鼠可以逃窜到第ai个房间中.现在要清理掉所有的老鼠,而在第i个房间中防止老鼠夹的花费是ci,问你消灭掉所有老 ...
- CodeForces - 455C Civilization (dfs+并查集)
http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...
- PAT甲题题解-1021. Deepest Root (25)-dfs+并查集
dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- hdu 1198 Farm Irrigation(深搜dfs || 并查集)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...
- 1021. Deepest Root (25)——DFS+并查集
http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...
- CF 115 A 【求树最大深度/DFS/并查集】
CF A. Party time limit per test3 seconds memory limit per test256 megabytes inputstandard input outp ...
- 51nod1307(暴力树剖/二分&dfs/并查集)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...
- ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集
Untrusted Patrol Time Limit: 3 Seconds Memory Limit: 65536 KB ...
随机推荐
- 用VBS将PPT转为图片
'使用方法:把ppt文件拖放到该文件上. '机器上要安装Powerpoint程序 On Error Resume Next Set ArgObj = WScript.Arguments pptfile ...
- js:字符串(string)转json
第一种方式: 使用js函数eval(); testJson=eval(testJson);是错误的转换方式. 正确的转换方式需要加(): testJson = eval("(" + ...
- WordPress主题制作教程5:循环
wordpress循环分两种,一种是自定义循环,一种是默认循环. 自定义循环:根据指定参数进行实例化 调用所有页面,post_type值:page对应页面,post对应文章 <?php $arg ...
- MSChart 控件
微软发布了.NET 3.5框架下的图表控件,功能很强劲,基本上能想到的图表都可以使用它绘制出来,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式,不过缺点也比较明显 ...
- JVM垃圾回收机制总结(6) :透视Java的GC特性
1. 使用 System.gc() 可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求 Java的垃圾回收. 在命令行中有一个参数-verbosegc可以查看Java使用的堆内存的情况,它的格式: ...
- Android 实现全屏、无标题栏
实现全屏无标题栏: 1.在xml文件中进行配置 AndroidManifest.xml中,找到需要全屏或设置成无标题栏的Activity,在该Activity进行如下配置即可. 实现全屏效果: and ...
- mysql view
定义:在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 1.视图是一个虚拟存在的表,视图可以包含表的全部或者部分记录,也可以由一个表或者多个表来创建.使用视图就可以不用看到数据表中的所有 ...
- storage size of ‘oldact’ isn’t known
#include <signal.h> int main(){struct sigaction act, oldact;return 0;} dies with the message t ...
- Case 架构的实际应用-1
We use testlink to manage cases, and the frame is below: Project Name -All Features(Modules) -Featur ...
- Python—开始编程
昨天我是在window上运行的Python,而今天我是在Linux上学习Python. 一般Linux上都已经安装了Python,只要我们在终端上输入命令#python,就会进入Python的交互界面 ...