标签:php ott tput 题意 can host sea ems res
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)
题意:给你m只狗跟n只猫,p个人,每个人有一只喜欢和不喜欢的动物;
可以选取一些动物,使得满足条件的人最多;
满足条件:一个人的喜欢的动物在,并且不喜欢的动物不在;
思路:二分图匹配最大点独立集模型=所有人-最大匹配;
把所有人的对立的关系连边;
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> #include<stdlib.h> #include<time.h> using namespace std; #define LL long long #define pi (4*atan(1.0)) #define eps 1e-6 #define bug(x) cout<<"bug"<<x<<endl; const int N=1e3+10,M=1e6+10,inf=1e9+10; const LL INF=5e17+10,mod=1e9+7; int n,m; int mp[N][N]; int linker[N]; bool used[N]; bool dfs(int a) { for(int i=0;i<n;i++) if(mp[a][i]&&!used[i]) { used[i]=true; if(linker[i]==-1||dfs(linker[i])) { linker[i]=a; return true; } } return false; } int hungary() { int result=0; memset(linker,-1,sizeof(linker)); for(int i=0;i<n;i++) { memset(used,0,sizeof(used)); if(dfs(i)) result++; } return result; } string l[N],disl[N]; int main() { int c,d; while(~scanf("%d%d%d",&c,&d,&n)) { memset(mp,0,sizeof(mp)); for(int i=0;i<n;i++) cin>>l[i]>>disl[i]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(l[i]==disl[j]||disl[i]==l[j]) mp[i][j]=1; } } int cnt=hungary(); printf("%d\n",n-cnt/2); } return 0; }
hdu 3829 Cat VS Dog 二分图匹配 最大点独立集
标签:php ott tput 题意 can host sea ems res
原文地址:http://www.cnblogs.com/jhz033/p/6936463.html