백준11375 열혈강호 작성일 2019-03-17 | In PS 문제 링크 http://icpc.me/11375 사용 알고리즘 이분 매칭 시간복잡도 O(VE) 풀이 너무 간단한 이분매칭 문제입니다. 위에 있는 그림과 같이 그래프를 모델링하시면 쉽게 풀 수 있습니다. 전체 코드 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include <bits/stdc++.h> using namespace std; class BipartiteMatch{ private: vector< vector<int> > adjList; vector<int> par; vector<bool> chk; int n, bias; bool _match(int v){ for(auto i : adjList[v]){ if(chk[i]) continue; chk[i] = 1; if(par[i] == -1 || _match(par[i])){ par[i] = v; return 1; } } return 0; } public: BipartiteMatch(){ n = bias = 0; } BipartiteMatch(int a, int b){ n = a+b+10; bias = a+5; adjList.resize(n), par.resize(n), chk.resize(n); } void setSize(int a, int b){ n = a+b+10; bias = a+5; adjList.resize(n), par.resize(n), chk.resize(n); } void addEdge(int a, int b){ b += bias; adjList[a].push_back(b); } int match(){ int ret = 0; fill(par.begin(), par.end(), -1); for(int i=0; i<bias; i++){ fill(chk.begin(), chk.end(), 0); if(_match(i)) ret++; } return ret; } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; BipartiteMatch bm(n, m); for(int i=1; i<=n; i++){ int t; cin >> t; for(int j=1; j<=t; j++){ int tt; cin >> tt; bm.addEdge(i, tt); } } cout << bm.match(); }