hdu 1068 Girls and Boys 匈牙利演算法求最大獨立集
阿新 • • 發佈:2019-02-08
題意:有n個同學之間有曖昧關係,求最多的一組同學,其之間任意兩人沒有曖昧關係。
由於是在n個同學內部匹配,我們把每個同學拆成兩份,求出的最大匹配除以二即可。
由定理:最大獨立集=定點數-最大匹配,可以求解。
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 1100 using namespace std; int mp[N][N],v[N],linker[N],n; int dfs(int t) { for(int i=0;i<n;i++) { if(!v[i]&&mp[t][i]) { v[i]=1; if(linker[i]==-1||dfs(linker[i])) { linker[i]=t; return 1; } } } return 0; } int hungary() { int ans=0; memset(linker,-1,sizeof(linker)); for(int i=0;i<n;i++) { memset(v,0,sizeof(v)); if(dfs(i)) ans++; } return ans; } int main() { while(~scanf("%d",&n)) { memset(mp,0,sizeof(mp)); for(int i=0;i<n;i++) { int u,v,t; scanf("%d: (%d)",&u,&t); for(int j=0;j<t;j++) { scanf("%d",&v); mp[u][v]=1; } } int ans=hungary()/2; cout<<n-ans<<endl; } }