F - 娜娜梦游仙境系列——多民族王国

F - 娜娜梦游仙境系列——多民族王国

Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)

Submit Status

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。

题意:

输入N和M表示有多少个人和语言的种类,然后再输入每一个人所掌握的语言,并查集的题目,由于数据量比较小,所有采用了用二维数组来保持关系,

A_B[i][j]表示编号i的人对于语言j是否掌握,1表示掌握,2表示不掌握。通过关系,构建并查集来连接判断能够构成多少条边,判断边数来判断答案、

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 using namespace std;
 6 int uset[3333],num[3333],parper[3333];
 7 int A_B[110][110];
 8 int Find(int x)
 9 {
10     int p=x,t;
11     while(uset[p]!= p)
12         p=uset[p];
13     while(x!=p)
14     {t=uset[x];uset[x]=p;x=t;}
15     return x;
16 }
17 int main()
18 {
19     int T,n,m,k,i,j,l,get,A,B,Begin;
20     int Num[110],Max;
21     scanf("%d",&T);
22     while(T--)
23     {
24         memset(A_B,0,sizeof(A_B));
25         scanf("%d %d",&n,&m);
26         {
27             for(i=0;i<n;i++)uset[i]=i;
28             for(i=0;i<m;i++)Num[i]=0;
29             for(i=0;i<n;i++)
30             {
31                 scanf("%d",&k);
32                 parper[i]=i;uset[i]=i;num[i]=1;
33                 for(j=0;j<k;j++)
34                 {
35                     scanf("%d",&get);
36                     A_B[i][get-1]=1;        /*记录关系*/
37                 }
38             }
39             for(j=0,Max=0,Begin=0;j<m;j++)
40             {
41                 for(i=0;i<n;i++)
42                 {
43                     if(A_B[i][j]==1)        /*查找第一个人所掌握的语言*/
44                     {
45                        Num[j]++;
46                        if(Max<Num[j])Max=Num[j];
47                        for(l=i+1;l<n;l++)
48                         {
49                             if(A_B[l][j]==1)        /*查找第其他人所掌握同样的语言*/
50                             {
51                                 A=Find(i);
52                                 B=Find(l);
53                                 if(A!=B)            /*判断是否产生新的边*/
54                                 {
55                                     Begin++;        /*新的边,则边数加1*/
56                                     uset[A]=B;       /*判断是否产生新的边*/
57                                 }
58                             }
59                         }
60                         break;
61                     }
62                 }
63             }
64             if(Begin==0)printf("%d\n",n-Max);
65             else if(Begin>=n-1)printf("0\n");
66             else printf("%d\n",n-1-Begin);
67         }
68     }
69     return 0;
70 }

时间: 2024-10-07 15:20:57

F - 娜娜梦游仙境系列——多民族王国的相关文章

ACdream HUT新生摸底训练赛 F - 娜娜梦游仙境系列——多民族王国 并查集

解题思路:并查集水题,多年前曾经用暴力水过. 解题代码: 1 // File Name: c.c 2 // Author: darkdream 3 // Created Time: 2013年03月01日 星期五 00时37分28秒 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<time.h> 9 #include<math.h> 10 11

G - 娜娜梦游仙境系列——梦醒

G - 娜娜梦游仙境系列——梦醒 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)     Special Judge Submit Status Problem Description 娜娜离开了这个王国,走向远方,在旷野上,娜娜看到了一个大时钟,上面的时针分针秒针都在缓缓转动,那只挥着翅膀的天使又出现了,天使说:“外面天已经亮了,娜娜你别睡过头哟~”,娜娜问:“我怎样才能醒过

A - 娜娜梦游仙境系列——诡异的钢琴

A - 娜娜梦游仙境系列——诡异的钢琴 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 从前,有一个ACdream王国,王国里住着一位公主,她叫娜娜,娜娜公主有一天做了一个很长很长的梦~她说她从来没有遇到过这些奇妙的东西~ 现在站在娜娜面前的是一台钢琴,这是一台看上去很正常的钢琴,上面有88个键(频率从27赫兹

E - 娜娜梦游仙境系列——莫名其妙的插曲

E - 娜娜梦游仙境系列——莫名其妙的插曲 E - 娜娜梦游仙境系列——莫名其妙的插曲 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Problem Description 娜 娜因为帮桃花村民们解决了一大难题而受到村民们的尊敬,不过由于娜娜还想继续探索这个神奇的世界,只好恋恋不舍地与村民告别.当娜娜离开村庄的一刻,娜娜 失忆了!她不记得桃花村的一切,她不记得之前吃了很多糖果

D - 娜娜梦游仙境系列——村民的怪癖

D - 娜娜梦游仙境系列——村民的怪癖 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 娜娜费劲九牛二虎之力终于把糖果吃完了(说好的吃不完呢?骗人,口亨~),于是,缘溪行,忘路之远近.忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷,娜娜甚异之.复前行,欲穷其林.林尽水源,便得一山,山有小口,仿佛若有光.便

C - 娜娜梦游仙境系列——吃不完的糖果

C - 娜娜梦游仙境系列——吃不完的糖果 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 娜娜好不容易才在你的帮助下"跳"过了这个湖,果然车到山前必有路,大战之后必有回复,大难不死,必有后福!现在在娜娜面前的就是好多好多的糖果还有一些黑不溜秋的东西!不过娜娜眼中只有吃不完的糖果!娜娜高兴地快要蹦起来了

B - 娜娜梦游仙境系列——跳远女王

B - 娜娜梦游仙境系列——跳远女王 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Problem Description 娜 娜觉得钢琴很无趣了,就抛弃了钢琴,继续往前走,前面是一片湖,娜娜想到湖的对岸,可惜娜娜找了好久都没找到小桥和小船,娜娜也发现自己不是神仙,不能像 八仙过海一样.正当娜娜发愁的时候,娜娜发现湖上面有一些石头!娜娜灵机一动,发现可以沿着石头跳吖跳吖,这样

acdream 1684 娜娜梦游仙境系列——莫名其妙的插曲 (gcd)

题意:一开始有一个集合,集合里有n个不同的数,然后Alice(娜娜)与Bob轮流进行操作,每人都可以任意选择两个数a,b,不妨设a>b,不过要求a-b不在集合中,把a-b放入集合(集合元素个数只增不减).如果轮到某人,无法进行任何操作,则该人输掉游戏.当Alice(娜娜)与Bob都沿着最优策略进行,娜娜先手,最终谁会获胜? 思路:减来减去的,跟最大公约数GCD差不多.此题没有什么最优的策略,都是平等的.用的也不是博弈知识. 最后不能操作的局面一定是{1g, 2g,3g......xg},3g表示

ACdream HUT新生摸底训练赛 E - 娜娜梦游仙境系列——莫名其妙的插曲 数论

解题思路:其实就是找能组成的最大集合.max(a[1],a[2],a[3].........a[n])/gcd(a[1],a[2],a[3],......a[n]) 解题代码: 1 // File Name: e.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 13时56分11秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #i