码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 277 A Learning Languages 【DFS 】

时间:2015-08-05 20:14:30      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

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

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 
 8 const int maxn = 105;
 9 int g[maxn][maxn],a[maxn][maxn];
10 int vis[maxn];
11 int n,m;
12 
13 void dfs(int u){
14     vis[u] = 1;
15     for(int v = 1;v <= n;v++){
16         if(!vis[v] && g[u][v]) dfs(v);
17     }
18 }
19 
20 int main(){
21     int ans = 0;
22     scanf("%d %d",&n,&m);
23     memset(g,0,sizeof(g));
24     memset(a,0,sizeof(a));
25     int tot = 0;
26     for(int u = 1;u <= n;u++){
27         int k;
28         scanf("%d",&k);
29         if(k == 0) tot++;
30         for(int i = 0;i < k;i++){
31             int v;
32             scanf("%d",&v);
33             a[u][v] = 1;
34         }
35     }
36     
37     if(tot == n) printf("%d\n",tot);
38     else {
39             for(int u = 1;u <= n;u++){
40             for(int v = u+1;v <= n;v++){
41             for(int k = 1;k <= m;k++){
42                 if(a[u][k] && a[v][k]) g[u][v] = g[v][u] = 1;
43             }
44             }
45       }
46     
47     for(int i = 1;i <= n;i++) {
48         if(!vis[i]){
49             ans++;
50             dfs(i);
51         }
52     }
53     printf("%d\n",ans-1);
54     }
55     return 0;
56 }
View Code

 

codeforces 277 A Learning Languages 【DFS 】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4705571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!