forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MinimumNumberOfPeopleToTeach.cpp
97 lines (88 loc) · 3.51 KB
/
MinimumNumberOfPeopleToTeach.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Source : https://leetcode.com/problems/minimum-number-of-people-to-teach/
// Author : Hao Chen
// Date : 2021-02-17
/*****************************************************************************************************
*
* On a social network consisting of m users and some friendships between users, two users can
* communicate with each other if they know a common language.
*
* You are given an integer n, an array languages, and an array friendships where:
*
* There are n languages numbered 1 through n,
* languages[i] is the set of languages the ith user knows, and
* friendships[i] = [ui, vi] denotes a friendship between the users u
* i and vi.
*
* You can choose one language and teach it to some users so that all friends can communicate with
* each other. Return the minimum number of users you need to teach.
* Note that friendships are not transitive, meaning if x is a friend of y and y is a friend of z,
* this doesn't guarantee that x is a friend of z.
*
* Example 1:
*
* Input: n = 2, languages = [[1],[2],[1,2]], friendships = [[1,2],[1,3],[2,3]]
* Output: 1
* Explanation: You can either teach user 1 the second language or user 2 the first language.
*
* Example 2:
*
* Input: n = 3, languages = [[2],[1,3],[1,2],[3]], friendships = [[1,4],[1,2],[3,4],[2,3]]
* Output: 2
* Explanation: Teach the third language to users 1 and 3, yielding two users to teach.
*
* Constraints:
*
* 2 <= n <= 500
* languages.length == m
* 1 <= m <= 500
* 1 <= languages[i].length <= n
* 1 <= languages[i][j] <= n
* 1 <= ui < vi <= languages.length
* 1 <= friendships.length <= 500
* All tuples (ui, vi) are unique
* languages[i] contains only unique values
******************************************************************************************************/
class Solution {
public:
bool hasLang(vector<int>& langlist, int lang){
for(auto& l : langlist) {
if (l == lang) return true;
}
return false;
}
bool canComm(int u, int v, int n, vector<vector<bool>>& langs) {
for (int l=0; l<n; l++) {
if (langs[u][l] && langs[v][l]) return true;
}
return false;
}
int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {
int persons = languages.size();
//use to check a person know a langauge or not
vector<vector<bool>> langs(persons, vector<bool>(n, false));
for (int p=0; p<persons; p++) {
for(int l=0; l<languages[p].size(); l++) {
langs[p][languages[p][l]-1] = true;
}
}
int result = persons;
vector<vector<bool>> langToTeach(n, vector<bool>(persons, false));
for (int l=0; l <n; l++) {
int cnt = 0;
vector<bool> teach(persons, false);
for (auto& fs : friendships) {
int u = fs[0] - 1;
int v = fs[1] - 1;
if (canComm(u, v, n, langs)) continue;
if (langs[u][l]==false && teach[u]==false) {
teach[u] = true; cnt++;
}
if (langs[v][l]==false && teach[v]==false) {
teach[v] = true; cnt++;
}
}
result = min(result, cnt);
}
return result;
}
};