A. Learning Languages (联通块)

 

题目链接:http://codeforces.com/problemset/problem/277/A

 

 

 

题目大意:

n个人,每个人会一些语言,两个人只要有会一门相同的语言就可以交流,问为了让这n个人都交流,至少还得学多少门语言

 

思路:

先根据n个人之间他们会的语言,建边

再dfs找出有多少个联通块ans,再加ans-1条边就可以让他们连通

注意特判一下每个人都会0门语言的情况

 

AC代码:

 1 #include <cstdio>
 2 #include <string>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <string.h>
 6 #include <math.h>
 7 #include <vector>
 8  
 9 using namespace std;
10  
11 int vis[105];
12 int mapp[105][105];
13 int a[105][105];
14 int n,m,k,val;
15  
16 void dfs(int i)
17 {
18     vis[i] = 1;
19     for (int j=1;j<=n;j++)
20     {
21         if (!vis[j] && mapp[i][j])
22             dfs(j);
23     }
24 }
25  
26 int main()
27 {
28     int tot = 0;
29     int ans = 0;
30     cin >> n >> m;
31     for (int i=1;i<=n;i++)
32     {
33         cin >> k;
34         if (k == 0)
35             tot++;
36         while (k--)
37         {
38             cin >> val;
39             a[i][val] = 1;
40         }
41     }
42     for (int i=1;i<=n;i++)
43     {
44         for (int j=i+1;j<=n;j++)
45         {
46             for (int o=1;o<=m;o++)
47             {
48                 if (a[i][o] && a[j][o])
49                     mapp[i][j] = mapp[j][i] = 1;
50             }
51         }
52     }
53     for (int i=1;i<=n;i++)
54     {
55         if (!vis[i])
56         {
57             ans++;
58             dfs(i);
59         }
60     }
61     if (tot == n)
62         printf("%d\n",n);
63     else
64         printf("%d\n",ans-1);
65     return 0;
66 }
67  

 

之前就做了一道联通块的题目,再经过这道题我觉得再遇到联通块的题目应该就可以快速想到了!

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务