hdu 1068

 自己写的板子就是好用,这道题是求的最大独立集不是最大匹配(英语弱渣),没看懂题调了半天代码找不到错。。GG

最大独立集 = n - (最大匹配 / 2)

#include<iostream>
#include<vector>
#include<memory.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
struct Hungary {
	int n, vis[maxn], link[maxn];
	vector <int> edge[maxn];        // 存下边
	
	void init(int n)
	{
		this -> n = n;
		memset(link, -1, sizeof(link));
		for(int i = 0;i <= n;i ++)	
			edge[i].clear();
	}
	void addEdge(int s, int t)
	{
		edge[s].push_back(t);
		edge[t].push_back(s);
	}
	int find(int k)
	{
	    for(int i = 0;i < edge[k].size();i ++)
	    {
	        int t = edge[k][i];
	        if(vis[t] == 0)
	        {
	            vis[t] = 1;
	            if(link[t] == -1 || find(link[t]))
	            {
	                link[t] = k;
	                return 1;
	            }
	        }
	    }
	    return 0;
	}
	int maxmatch()
	{
	    int ans = 0;
	    for(int i = 1;i <= n;i ++)
	    {
	        memset(vis, 0, sizeof(vis));
	        if(find(i)) ans ++;
	    }
	    return ans;
	}
}Match; 

int main()
{
	int n;
    while(~scanf("%d", &n))
    {
        Match.init(n);
        int a, b, c;
        for(int j = 0;j < n;j ++)
        {
            scanf("%d:  (%d)", &a, &b);
            for(int i = 0;i < b;i ++)
            {
                scanf("%d", &c);
                Match.addEdge(a + 1, c + n + 1);
            }            
        }

        printf("%d\n", n - (Match.maxmatch() >> 1));
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41695941/article/details/81705168