Girls and Boys HDU - 1068
阿新 • • 發佈:2021-07-14
原題連結
考察:二分圖
思路:
求最大的集合,該集合內無邊相連,即最大獨立集.這裡比較難把點分成二部分.我們可以直接不分,將每個點看成出度和入度,每條邊(不相交)都等價於2個匹配.最後將匹配數\(/2\)即可.
Code
#include <iostream> #include <cstring> #include <vector> using namespace std; const int N = 1010; int n,match[N]; bool st[N]; vector<int> to[N]; bool dfs(int u) { for(int i=0;i<to[u].size();i++) { int v = to[u][i]; if(st[v]) continue; st[v] = 1; if(!match[v]||dfs(match[v])) { match[v] = u; return 1; } } return 0; } int main() { while(scanf("%d",&n)!=EOF) { memset(match,0,sizeof match); for(int i=0;i<n+5;i++) to[i].clear(); for(int i=0;i<n;i++) { int id,sz,j; scanf("%d: (%d) ",&id,&sz); while(sz--) { scanf("%d",&j); to[id].push_back(j); } } int res = 0; for(int i=0;i<n;i++) { memset(st,0,sizeof st); if(dfs(i)) ++res; } printf("%d\n",n-res/2); } return 0; }