zoukankan      html  css  js  c++  java
  • hihoCoder #1127:二分图最小点覆盖和最大独立集

    题目大意:求二分图最小点覆盖和最大独立集。

    题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配;任意两个点之间都没有边相连的最大点集称为最大独立集,它等于总节点数减去最大匹配数。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<cmath>
    # include<vector>
    # include<list>
    # include<queue>
    # include<map>
    # include<set>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    const int N=1000;
    const int INF=1000000000;
    const double inf=1e20;
    
    int n,m;
    int link[N+5];
    vector<int>e[N+5];
    int mark[N+5];
    
    bool match(int x)
    {
    	for(int i=0;i<e[x].size();++i){
    		int y=e[x][i];
    		if(mark[y]) continue;
    		mark[y]=1;
    		if(link[y]==-1||match(link[y])){
    			link[y]=x;
    			return true;
    		}
    	}
    	return false;
    }
    
    
    int main()
    {
    	while(~scanf("%d%d",&n,&m))
    	{
    		for(int i=0;i<n;++i) e[i].clear();
    		int a,b;
    		while(m--)
    		{
    			scanf("%d%d",&a,&b);
    			--a,--b;
    			e[a].push_back(b);
    			e[b].push_back(a);
    		}
    		int cnt=0;
    		memset(link,-1,sizeof(link));
    		for(int i=0;i<n;++i){
    			memset(mark,0,sizeof(mark));
    			if(match(i)) ++cnt;
    		}
    		cnt/=2;
    		printf("%d
    %d
    ",cnt,n-cnt);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    蓝桥杯--算法训练 区间k大数查询
    vijos1782:借教室
    vijos1779国王游戏
    C++大数模板
    HDU1042(N!:设4为基数)
    HDU1026(延时迷宫:BFS+优先队列)
    POJ3984(迷宫问题)
    HDU3018:Ant Trip(欧拉回路)
    HDU5438:Ponds(拓扑排序)
    2008北航:字符串匹配
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5484157.html
Copyright © 2011-2022 走看看