조용한 5분을 줘
문제
흑석이와 상도는 국내 최고의 걸그룹인 CAU(Complete & Awesome Unit)을 좋아한다. CAU에는 흑석이와 상도는 좋아하는 멤버가 각각 여러명 존재한다.
흑석이와 상도는 최고로 좋아하는 멤버인 최애 멤버를 정하고자 한다. 그런데 두 친구가 같은 멤버를 좋아하는 것은 두 친구 간의 우정 때문에 그럴 수 없다고 한다.
따라서 우리는 친구들의 우정을 지키기 위해 최고로 좋아하는 멤버인 최애 멤버 1명을 서로 다른 멤버로 정하고자 한다.
친구들의 우정을 지키기 위한 프로그램을 작성해보자.
입력
첫째 줄에 친구들의 수 N과 걸그룹의 멤버 수 M이 주어진다. (2 ≤ N, M ≤ 1000)
다음 M개 줄에 걸쳐서 걸그룹 멤버의 이름이 각각 주어진다. 걸그룹 멤버의 이름은 영문 대문자로만 이뤄져 있으며, 최대 길이는 100글자이다.
다음 N개 줄에 걸쳐서 친구 별로 좋아하는 멤버 수 K(1 ≤ K ≤ M)와 좋아하는 걸그룹 멤버 이름들이 공백을 사이에 두고 주어진다.
출력
첫 번째 줄에는 친구들의 우정을 지킬 수 있는 지 여부를 출력한다.
우정을 지킬 수 없는 경우 두 번째 줄에는 최대한 겹치지 않게 친구들 전체가 좋아할 수 있는 최대 멤버 수를 출력한다.
친구들과 걸그룹 멤버들을 각각 다른 그룹으로 놓고, 이분그래프를 생성합니다.
최대매칭을 구하고,
최대매칭수가 친구들의 수보다 작으면 NO와 매칭수를, 같다면 YES를 출력합니다.
#include<bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false),cin.tie(NULL);
#define mset(v) memset(v,0,sizeof(v));
#define rep(i,a) for(int i=0;i<a;++i)
#define REP(i,a) for(int i=1;i<=a;++i)
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int>ti;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
int dy[] = { -1,0,1,0 }, dx[] = { 0,1,0,-1 }, INF = 987654321;
int N, M, v[1001], s[1001];
vi adj[1001];
string id[1001];
bool dfs(int t) {
if (v[t])return 0;
v[t] = 1;
for (int r : adj[t]) {
if (!s[r] || dfs(s[r])) {
s[r] = t;
return 1;
}
}
return 0;
}
int main() {
FAST;
cin >> N >> M;
REP(i, M)cin >> id[i];
int x;
string str;
REP(i, N) {
cin >> x;
while (x--) {
cin >> str;
REP(j, M) {
if (id[j] == str) {
adj[i].push_back(j);
break;
}
}
}
}
int cnt = 0;
REP(i, N) {
mset(v);
if (dfs(i)) {
cnt++;
}
}
if (cnt == N) {
cout << "YES";
}
else
cout << "NO\n"<< cnt;
}
'baekjoon' 카테고리의 다른 글
[백준] 4485 녹색 옷을 입은 애가 젤다지? (1) | 2023.06.07 |
---|---|
[백준] 14433 한조 대기 중 (0) | 2023.06.07 |
[백준] 1446 지름길 (0) | 2023.06.05 |
[백준] 15892 사탕 줍는 로봇 (0) | 2023.06.01 |
[백준] 14827 벼락치기 (0) | 2023.06.01 |