Strategic Game HDU - 1054(最小顶点覆盖)

最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联;

。。。以为自己很聪明。。用边连边。。。最后还是点连点  哎。。。。

hc 写的  匈牙利足够/////

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 10010, INF = 0x7fffffff;
int dx[maxn], dy[maxn], cx[maxn], cy[maxn], used[maxn];
int nx, ny, dis, n;
vector<int> G[maxn];
int bfs()
{
    queue<int> Q;
    dis = INF;
    mem(dx, -1);
    mem(dy, -1);
    for(int i=0; i<=nx; i++)
    {
        if(cx[i] == -1)
        {
            Q.push(i);
            dx[i] = 0;
        }
    }
    while(!Q.empty())
    {
        int u = Q.front(); Q.pop();
        if(dx[u] > dis) break;
        for(int v=0; v<G[u].size(); v++)
        {

            int i = G[u][v];
            if(dy[i] == -1)
            {
                dy[i] = dx[u] + 1;
                if(cy[i] == -1) dis = dy[i];
                else
                {
                    dx[cy[i]] = dy[i] + 1;
                    Q.push(cy[i]);
                }
            }
        }
    }
    return dis != INF;
}

int dfs(int u)
{
    for(int v=0; v<G[u].size(); v++)
    {
        int i = G[u][v];
        if(!used[i] && dy[i] == dx[u] + 1)
        {
            used[i] = 1;
            if(cy[i] != -1 && dis == dy[i]) continue;
            if(cy[i] == -1 || dfs(cy[i]))
            {
                cy[i] = u;
                cx[u] = i;
                return 1;
            }
        }
    }
    return 0;
}

int hk()
{
    int res = 0;
    mem(cx, -1);
    mem(cy, -1);
    while(bfs())
    {
        mem(used, 0);
        for(int i=0; i<=nx; i++)
        {
            if(cx[i] == -1 && dfs(i))
                res++;
        }
    }
    return res;
}


int main()
{
    while(cin>> n)
    {
        for(int i=0; i<maxn; i++) G[i].clear();
        for(int i=0; i<n; i++)
        {
            int u, m;
            scanf("%d:(%d)",&u, &m);
            for(int j=0; j<m; j++)
            {
                int v;
                scanf("%d",&v);
                G[u].push_back(v);
                G[v].push_back(u);
            }

        }

        nx = ny = n-1;
    //    cout<< rt<< "  " << nx << "   " <<endl;

        cout<< hk()/2 <<endl;

    }


    return 0;
}

 

posted @ 2018-07-14 21:47  WTSRUVF  阅读(225)  评论(0编辑  收藏  举报