有p个小朋友参观动物园,动物园里面有两种动物,分别为猫和狗。规定一个小朋友喜欢猫就讨厌狗,喜欢狗就讨厌猫。
现在管理员要移走0一些动物,当然,移走也是有条件的。比如一个小朋友喜欢猫3,讨厌狗4.那么移走狗4,这个小朋友就会非常开心。同样,如果移走猫3,小朋友就会很不高兴。现在问怎么样才能使开心的小朋友的人数最多
二分图最大独立集
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)
using namespace std;
int n, m, k, edge[509][509], done[509], link[509], f[1009][3];
bool dfs (int x)
{
rep (i, 1, n)
if (!done[i] && edge[x][i])
{
done[i] = 1;
if (link[i] == -1 || dfs (link[i]))
{
link[i] = x;
return 1;
}
}
return 0;
}
int solve ()
{
int ret = 0;
rep (i, 1, n)
{
memset (done, 0, sizeof (done));
if (dfs (i))
ret++;
}
return ret;
}
int main ()
{
while (scanf ("%d%d%d", &m, &k, &n) == 3)
{
memset (link, -1, sizeof (link));
memset (edge, 0, sizeof (edge));
memset (f, 0, sizeof (f));
rep (i, 1, n)
{
rep (j, 1, 2)
{
getchar ();
char now = getchar ();
scanf ("%d", &f[i][j]);
if (now == 'D')
f[i][j] += m;
}
}
//rep (i, 1, n) printf ("%d === %d\n", f[i][1], f[i][2]);
rep (i, 1, n)
rep (j, 1, n)
if (f[i][2] == f[j][1] || f[i][1] == f[j][2])
edge[i][j] = edge[j][i] = 1;
//rep (i, 1, n) rep (j, 1, n) if (edge[i][j]) printf ("edge %d %d\n", i, j);
cout << n - solve () / 2 << endl;
}
return 0;
}