• Strategic Game HDU


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

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

    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;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    IOS 获取时间的问题
    JQ 点赞
    截取字符串第一个空格前的字符
    JQ 的一些方法
    匿名函数var a =function(){}和function a(){}的区别
    完美支持中文编程的 Emacs 配置文件 .emacs
    linux find 命令忽略某个或多个子目录的方法
    Linux下如何用date设置时间
    nagios的监控代码!
    shell脚本监控apache进程数和oracle连接数
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9311068.html
Copyright © 2020-2023  润新知