zoukankan      html  css  js  c++  java
  • 11-过山车(二分图匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063         

                 过山车

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


    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
     
    Author
    PrincessSnow
     
    Source
     
    Recommend
    lcy   |   We have carefully selected several similar problems for you:  1068 1083 2444 1281 1150 
     
    思路:这是二分图匹配的裸题,直接匈牙利算法即可。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    int n, m;
    int map[505][505];
    int visit[505];
    int pei[505];
    
    int find(int x){   //匈牙利算法 
    	for(int i = 1; i <= m; i++){     //为x男生匹配女生 
    		if(!visit[i] && map[x][i]){  //如果当前为x匹配时是没有访问过i女生并且x对i有好感,则开始尝试 
    			visit[i] = 1; 				
    			if(pei[i] == 0 || find(pei[i])){ //如果刚好这个女生当前没有匹配其他男生或者可以为她匹配的男生换一个 
    				pei[i] = x;					 //则当前男生匹配成功 
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    
    int match(){
    	int ans = 0;
    	for(int i = 1; i <= n; i++){        //尝试为每个男生去找女生 
    		memset(visit, 0, sizeof(visit));//清空当前男生访问记录 
    		if(find(i))
    			ans++;
    	}
    	return ans;
    }
    
    int main(){
    	int k, x, y; 
    	while(scanf("%d", &k) == 1 && k != 0){
    		memset(map, 0, sizeof(map));
    		memset(pei, 0, sizeof(pei));
    		scanf("%d%d", &n, &m);
    		for(int i = 0; i < k; i++){
    			scanf("%d%d", &x, &y);
    			map[x][y] = 1;
    		}
    		printf("%d
    ", match());
    	}
    	return 0;
    } 
    

      

     
  • 相关阅读:
    【Q&A】pytorch中的worker如何工作的
    【教程】opencv-python+yolov3实现目标检测
    ubuntu使用scrcpy手机投屏-免费神器scrcpy【介绍、安装、使用】
    【从踩坑到教程】win10下ubuntu18.04双系统UEFI模式安装、Nvidia驱动安装
    Python引用与目录结构
    交流总结
    转载-趣图展现程序员职业生涯的11个阶段
    转载-在家工作,10招助你效率、生活两不误
    转载-新年寄望:从小做起,活在当下
    转载-成为明星程序员的10个提示
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8446757.html
Copyright © 2011-2022 走看看