HDU 3829Cat VS Dog

来源:互联网 发布:域名投资的秘密电子书 编辑:程序博客网 时间:2024/06/05 09:12
有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;}


0 0