题意:
n个小孩,每个小孩喜欢一种动物讨厌一种动物
你是管理员,可以任意去掉一些动物
当小孩讨厌的动物被去掉并且喜欢的动物没有被去掉时,
他是开心的
问最多让多少小孩开心
思路:
让有矛盾的小孩建边,求最大独立集即可
/* *********************************************** Author :devil Created Time :2016/5/17 17:13:21 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int N=510; int link[N],c,d,n; string s1[N],s2[N]; bool vis[N]; vector<int>eg[N]; bool dfs(int u) { for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(!vis[v]) { vis[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return 1; } } } return 0; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&c,&d,&n)) { memset(link,-1,sizeof(link)); for(int i=1;i<=n;i++) eg[i].clear(); for(int i=1;i<=n;i++) cin>>s1[i]>>s2[i]; for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) { if(s1[i]==s2[j]||s1[j]==s2[i]) { eg[i].push_back(j); eg[j].push_back(i); } } } int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } printf("%d\n",n-ans/2); } return 0; }
时间: 2024-12-06 10:10:31