Cat VS Dog
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 125536/65536K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 7
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Now the zoo administrator is removing some animals, if one child's like-animal is not removed and his/hers dislike-animal is removed, he/she will be happy. So the administrator wants to know which animals he should remove to make maximum number of happy children.
Input
Next P lines, each line contains a child's like-animal and dislike-animal, C for cat and D for dog. (See sample for details)
Output
Sample Input
1 1 2 C1 D1 D1 C1 1 2 4 C1 D1 C1 D1 C1 D2 D2 C1
Sample Output
1 3
把每个学生看做一个点,设一个同学为点i,若删掉同学i不喜欢的动物,会引起另一个同学j不快乐。用map[i][j]=map[j][i]=1把同学i和j联系起来。则求出他的最大独立集就可以求出
最多个同学快乐的数量。
#include#include#include#include#includeusing namespace std;const int N = 501;int map[N][N]; int vis[N];int match[N];int n, m;int P;string A[N], B[N];void init(){ int i, j; for (i = 0; i < N; i++){ vis[i] = 0; match[i] = -1; for (j = 0; j < N; j++){ map[i][j] = 0; } }}bool find(int x){ int i; for (i = 1; i <= P; i++){ if (!vis[i] && map[x][i]){ vis[i] = 1; if (match[i] == -1 || find(match[i])) { match[i] = x; return true; } } } return false;}int Match(){ int ans = 0; int i; for (i = 1; i <= P; i++){ memset(vis, 0, sizeof(vis)); if (find(i)) ans++; } return ans;}int main(){ freopen("in.txt", "r", stdin); while (~scanf("%d%d%d", &n, &m, &P)){ int i,j; init(); for (i = 1; i <= P; i++){ cin >> A[i] >> B[i]; }/*for(i=1;i<=P;i++){cout<<A[i]<<" "<<B[i]<<endl;}*/ getchar(); for (i = 1; i <= P; i++){ for (j = 1; j <= P; j++){ if (B[i] == A[j]){ map[j][i]=map[i][j] = 1; } } } int ans = Match(); printf("%d\n", P-ans/2); } return 0;}