求一个集合最多几个人,其之间任意两人没有暧昧关系。
二分图匹配
最大独立集 = 总点数 - 最大匹配数
匈牙利算法
因为每个同学都在二分图的两侧
当 A与B匹配时,B与A也匹配
所以 所求的最大匹配数要除以2
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 using namespace std; 6 const int maxn=1000; 7 int n,a,m,b; 8 vector<int>map[maxn]; 9 int link[maxn]; 10 int vis[maxn]; 11 bool dfs(int t) 12 { 13 int size=map[t].size(); 14 for(int i=0;i<size;i++) 15 { 16 int x=map[t][i]; 17 if(!vis[x]) 18 { 19 vis[x]=1; 20 if(link[x]==-1||dfs(link[x])) 21 { 22 link[x]=t; 23 return 1; 24 } 25 } 26 } 27 return 0; 28 } 29 int main() 30 { 31 while(~scanf("%d",&n)) 32 { 33 for(int i=0;i<n;i++) 34 { 35 scanf("%d: (%d)",&a,&m); 36 map[i].clear(); 37 for(int j=0;j<m;j++) 38 { 39 scanf("%d",&b); 40 map[a].push_back(b); 41 } 42 } 43 memset(link,-1,sizeof(link)); 44 int ans=0; 45 for(int i=0;i<n;i++) 46 { 47 memset(vis,0,sizeof(vis)); 48 if(dfs(i)) 49 ans++; 50 } 51 printf("%d ",n-ans/2); 52 } 53 }