zoukankan      html  css  js  c++  java
  • (step6.3.3)hdu 1150(Machine Schedule——二分图的最小点覆盖数)

    题目大意:第一行输入3个整数n,m,k。分别表示女生数(A机器数),男生数(B机器数),以及它们之间可能的组合(任务数)。

    在接下来的k行中,每行有3个整数c,a,b。表示任务c可以有机器A的a状态或者是机器B的b状态来完成


    解题思路:最小点覆盖数

    1)如果把一个任务看成是一条直线,那么机器的状态就为一个点。在所有任务都必须完成的情况下(即一条直线上至少要有一个端点),

    求所需要的最少的端点数


    代码如下:

    /*
     * 1150_1.cpp
     *
     *  Created on: 2013年8月30日
     *      Author: Administrator
     */
    
    #include <iostream>
    
    using namespace std;
    
    
    const int maxn = 101;
    int map[maxn][maxn];
    int link[maxn];
    bool useif[maxn];
    int n,m;
    
    int can(int t){
    	int i;
    	for(i = 1 ; i <= m ; ++i){
    		if(useif[i] == 0 && map[t][i]){
                useif[i] = 1;
    			if(link[i] == -1 || can(link[i])){
                   link[i] = t;
                   return 1;
    			}
    		}
    	}
    
    	return 0;
    }
    
    int max_match(){
    	int i;
    	int num = 0;
    	memset(link,-1,sizeof(link));
    	for(i = 1 ; i<= n ; ++i){
    		memset(useif,0,sizeof(useif));
    		if(can(i)){
    			num++;
    		}
    	}
    	return num;
    }
    
    int main(){
    	int k;
    	while(scanf("%d%d%d",&n,&m,&k)!=EOF,n){
    		int i;
    		memset(map,0,sizeof(map));
    		for(i = 0 ; i < k ; ++i){
    			int c,a,b;
    			scanf("%d%d%d",&c,&a,&b);
    			map[a][b] = 1;
    		}
    		printf("%d
    ",max_match());
    	}
    }
    
    




  • 相关阅读:
    博客园的博客
    JAVASCRIPT拷贝内容到剪切板
    adobe acrobat pro 8.0/8.1 激活
    lighttpd+PHP上传文件
    windows上UPNP/DLNA服务器软件测试
    maven环境搭建
    Chrome调试博客地址
    struts2技术内幕读书笔记1
    git推送
    第九周助教小结
  • 原文地址:https://www.cnblogs.com/pangblog/p/3293788.html
Copyright © 2011-2022 走看看