• POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法


    Kindergarten
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 5884   Accepted: 2877

    Description

    In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some girls and boys know each other. Now the teachers want to pick some kids to play a game, which need that all players know each other. You are to help to find maximum number of kids the teacher can pick.

    Input

    The input consists of multiple test cases. Each test case starts with a line containing three integers
    GB (1 ≤ GB ≤ 200) and M (0 ≤ M ≤ G × B), which is the number of girls, the number of boys and
    the number of pairs of girl and boy who know each other, respectively.
    Each of the following M lines contains two integers X and Y (1 ≤ X≤ G,1 ≤ Y ≤ B), which indicates that girl X and boy Y know each other.
    The girls are numbered from 1 to G and the boys are numbered from 1 to B.

    The last test case is followed by a line containing three zeros.

    Output

    For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the maximum number of kids the teacher can pick.

    Sample Input

    2 3 3
    1 1
    1 2
    2 3
    2 3 5
    1 1
    1 2
    2 1
    2 2
    2 3
    0 0 0

    Sample Output

    Case 1: 3
    Case 2: 4

    题意是幼儿园有很多小孩,男生和男生互相熟悉,女生和女生互相熟悉。然后给出了一些男生和一些女生互相熟悉的关系,要找到一个最大的群体,这个群体中所有人都互相熟悉,问这个群体最多多少人。

    二分图的最大点独立集(二分图中两两互不相连的点的集合) = N - 二分图的最大匹配数量

    这个题要求的点独立集是要两两互相连,所以这要求的是补图的最大点独立集。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    int grid[205][205];
    int link[205];
    int visit[205];
    int n,m,k,V1,V2;
    int result;
    
    bool dfs(int x)
    {
    	int i;
    	for(i=1;i<=V2;i++)
    	{
    		if(grid[x][i]==0&&visit[i]==0)
    		{
    			visit[i]=1;
    			if(link[i]==-1||dfs(link[i]))
    			{
    				link[i]=x;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    
    void Magyarors()
    {
    	int i;
    	
    	result=0;
    	memset(link,-1,sizeof(link));//!!这里不能是0
    
    	for(i=1;i<=V1;i++)
    	{
    		memset(visit,0,sizeof(visit));
    		if(dfs(i))
    			result++;
    	}
    	cout<<V1+V2-result<<endl;
    }
    
    int main()
    {
    	int i,j,pair,temp1,temp2;
    
    	for(i=1;;i++)
    	{
    		scanf("%d%d%d",&n,&m,&pair);
    		V1=n;
    		V2=m;
    		if(n==0&&m==0&&pair==0)
    			break;
    
    		cout<<"Case "<<i<<": ";
    		memset(grid,0,sizeof(grid));
    
    		for(j=1;j<=pair;j++)
    		{
    			scanf("%d%d",&temp1,&temp2);
    			grid[temp1][temp2]=1;
    		}
    		Magyarors();
    	}
    	return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    权限设计=功能权限+数据权限
    C# 自定义配置文件
    asp.net core 系列 2 启动类 Startup.CS
    asp.net core 系列 1 概述
    IOC : Unity 配置和使用
    Unity Ioc 依赖倒置及Untity AOP被动拦截/自动拦截
    webuploader-异步切片上传(暂不支持断点续传)及 下载方法!C#/.NET
    C# 构造基础返回值类型-BaseResponse
    神奇的选择器 :focus-within
    妙用 scale 与 transfrom-origin,精准控制动画方向
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899545.html
Copyright © 2020-2023  润新知