zoukankan      html  css  js  c++  java
  • 【二分图最大匹配】【HDU2063】过山车

    过山车

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


    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




    裸的二分图匹配    对每条路找增广路


    细节:

    1.used(V)数组 以及 保存配对的点

    2.每次清空used(V)数组

    #include <cstdio>  
    #include <cstdlib>  
    #include <cmath>  
    #include <cstring>  
    #include <ctime>  
    #include <algorithm>  
    #include <iostream>
    #include <sstream>
    #include <string>
    #define oo 0x13131313
    #define maxn 1001   
    using namespace std;
    struct edge {int to;edge *next;};
    struct node {edge *first;};
    node Graph[maxn];
    edge E[maxn*10],*EE=E+1;
    int ans;
    int visit[maxn];
    int V[maxn];
    int K,M,N;
    void Link(int a,int b) {*EE=(edge){b,Graph[a].first};Graph[a].first=EE++;}
    void CreatGraph()
    {
    	memset(Graph,0,sizeof(Graph));
    	memset(E,0,sizeof(E));
    	memset(V,0,sizeof(V));
    	memset(visit,0,sizeof(visit));
    	ans=0;EE=E+1;
    	int a,b;
    	for(int i=1;i<=K;i++)
    	{
    		scanf("%d%d",&a,&b);
    		Link(a,M+b);
    		Link(M+b,a);
    	}
    }
    bool crosspath(int a)
    {
    	for(edge *p=Graph[a].first;p;p=p->next)
    	{
    		int k=p->to;
    		if(V[k]==0)  
    		{
    			V[k]=1;
    			if(visit[k]==0||crosspath(visit[k]))
    			{
    				visit[k]=a;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    void hungary()
    {
    	for(int i=1;i<=M;i++)
    	{
    		if(crosspath(i))
    		{
    			ans++;
    		
    		}
    			memset(V,0,sizeof(V));
    	}
    
    }
    int main()
    {
    //	freopen("a.in","r",stdin);
    //	freopen("a.out","w",stdout);
    	while(1)
    	{
    		cin>>K;
    		if(K==0) break;
    		cin>>M>>N;
    		
    		CreatGraph();
    		hungary();
    		cout<<ans<<endl;
    	}
    	return 0;
    }
      


  • 相关阅读:
    一些常用的表单验证的代码
    JQuery 在线参考手册
    jQuery ajax
    DIV+CSS专题:十天学会DIV+CSS
    wordpress调用函数大全
    WordPress 主题教程:从零开始制作 WordPress 主题
    全面提升WordPress前台和后台的 打开速度的方案
    详细的图文介绍如何利用XAMPP本地建站的环境配置教程
    2014年,daliu_it 年末文章汇总清单
    再见,2014;您好,2015!
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480432.html
Copyright © 2011-2022 走看看