HDU-1068-GirlsandBoys(最大獨立集,二分圖匹配)
阿新 • • 發佈:2019-05-15
ndb 二分圖 sca iterator ostream back pro 兩個人 for
鏈接:https://vjudge.net/problem/HDU-1068#author=0
題意:
學校對n個學生(男女都有)進行的調查了,發現了某些學生暗生情愫,現在需要你選出一個最大的集合,這個集合內部沒有兩個人暗生情愫。學生的編號是0~n-1
思路:
二分圖匹配,因為沒有分左右每對匹配會出現兩次。
而最大獨立集就是總人數,減去匹配數。
代碼:
#include <iostream> #include <memory.h> #include <string> #include <istream> #include <sstream> #include <vector> #include <stack> #include <algorithm> #include <map> #include <queue> #include <math.h> #include <cstdio> #include <set> #include <iterator> #include <cstring> using namespace std; typedef long long LL; const int MAXN = 2000+10; vector<int> G[MAXN]; int Link[MAXN], Vis[MAXN]; int n; void Init() { for (int i = 0;i < n;i++) G[i].clear(); } bool Dfs(int x) { for (int i = 0;i < G[x].size();i++) { int node = G[x][i]; if (Vis[node]) continue; Vis[node] = 1; if (Link[node] == -1 || Dfs(Link[node])) { Link[node] = x; return true; } } return false; } int Solve() { int cnt = 0; memset(Link, -1, sizeof(Link)); for (int i = 0;i < n;i++) { memset(Vis, 0, sizeof(Vis)); if (Dfs(i)) cnt++; } return cnt; } int main() { while (~scanf("%d", &n)) { Init(); int s, num, p; for (int i = 0; i < n; i++) { scanf("%d: (%d)", &s, &num); for (int j = 1;j <= num;j++) { scanf("%d", &p); G[s].push_back(p); } } int cnt = Solve(); printf("%d\n", n-cnt/2); } return 0; }
HDU-1068-GirlsandBoys(最大獨立集,二分圖匹配)