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 | #include <stdio.h> #include <vector> #include <algorithm> using namespace std; vector<vector<int> > adj; int from[100000] = { 0 }; int visit[100000] = { 0 }; int dfs(int x) { if (visit[x] == 1) { return 0; } visit[x] = 1; for (int i = 0; i < adj[x].size(); i++) { int tmp = adj[x][i]; if (from[tmp] == 0) { from[tmp] = x; return 1; } else { if (dfs(from[tmp]) == 1) { from[tmp] = x; return 1; } } } return 0; } int main() { int n, m; scanf("%d %d", &n, &m); adj.resize(n + 1); for (int i = 1; i <= n; i++) { int num; scanf("%d", &num); for (int j = 0; j < num; j++) { int tmp; scanf("%d", &tmp); adj[i].push_back(tmp); } } int rst = 0; for (int i = 1; i <= n; i++) { fill(visit, visit + n + 1, 0); if (dfs(i)==1) rst++; } printf("%d", rst); } | cs |
'알고리즘 > 그리디 알고리즘' 카테고리의 다른 글
2873 롤러코스터 (재풀이 필요) (0) | 2019.06.30 |
---|---|
9576 책 나눠주기 (0) | 2019.06.29 |
2262 토너먼트 만들기 (복습 필요. 왜 그리디?) (0) | 2019.06.29 |
2828 사과담기 게임 (0) | 2019.06.28 |
2816 디지털 티비 (0) | 2019.06.28 |