• 【二分图匹配入门专题1】A



    过山车

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 23353    Accepted Submission(s): 10128


    Problem Description
    RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
     

    Input
    输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
    1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
     

    Output
    对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
     

    Sample Input
    6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0
     

    Sample Output
    3
     

    我们直接套匈牙利算法最大匹配模板就好啦


    
    #include<stdio.h>
    #include<string.h>
    #define N 550
    int n,x,m,g,b;
    int e[N][N];
    int book[N],match[N];
    
    int dfs(int u)
    {
    	int i;
    	for(i = 1; i <= m; i ++)
    	{
    		if(!book[i]&&e[u][i])
    		{
    			book[i] = 1;
    			if(!match[i]||dfs(match[i]))
    			{
    				match[i] = u;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    int main()
    {
    	int i,j,t1,t2,sum;
    	while(scanf("%d",&x),x!=0)
    	{
    		scanf("%d%d",&n,&m);
    		sum = 0;
    		memset(e,0,sizeof(e));
    		memset(match,0,sizeof(match));
    		for(i = 1; i <= x; i ++)
    		{
    			scanf("%d%d",&t1,&t2);
    			e[t1][t2] = 1;
    		}
    		for(i = 1; i <= n; i ++)
    		{
    			memset(book,0,sizeof(book));
    			if(dfs(i))
    				sum ++;
    		}
    		printf("%d
    ",sum);
    	}
    	return 0;
    }






  • 相关阅读:
    Silverlight如何logging?
    写一个Attribute用于标注类的核心函数, 方便阅读
    WPF : 如何使用DataTemplateSelector
    WPF : 性能调整
    组成UI的元素
    DemoFlowControl
    对象设计: 数据边界(Data Scope)
    sql for xml path用法
    行列转置快速实现
    js移除数组中德重复数据
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7350052.html
Copyright © 2020-2023  润新知