POJ 1466 Girls and Boys
阿新 • • 發佈:2018-12-15
題意:根據給出的資料,可以得出點與點之間的關係,如果兩個不同集合中的點有一條關聯線的話,那就證明他們有關係,否則就沒有關係,題目讓我們求的是從這n個點中,找出m個點,這m個點中兩兩之間沒有關聯關係。求m的最大值 。
最大獨立集點數 = n-最大匹配數。
最大獨立數 = 未匹配的節點+匹配數/2;
未匹配的節點數 = 頂點數 - 匹配數;
得出 : 最大獨立數 = 頂點數 - 匹配數/2;-------> 結論推導來源
#include<stdlib.h> #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<vector> using namespace std; const int maxn=1000; int n,m,res; int num[maxn],vis[maxn],form[maxn]; int g[maxn][maxn]; bool find(int x) { for(int i=0;i<n;i++) { int v=g[x][i]; if( v && vis[i]==0) { vis[i]=1; if(form[i]==-1 || find(form[i])) { form[i]=x; return true; } } } return false; } int Hungary() { memset(form,0xff,sizeof(form)); int all=0; for(int i=0;i<n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) all++; } return all; } int main() { while(scanf("%d",&n)!=EOF) { memset(g,0,sizeof(g)); for(int p=0;p<n;p++) { scanf("%d: (%d) ",&m,&res); for(int i=0;i<res;i++) { int k; scanf("%d",&k); g[m][k]=1; } } int ans=Hungary(); printf("%d\n",n-ans/2); } return 0; }