zoukankan      html  css  js  c++  java
  • URAL 1109 Conference

    打开题目网址:http://acm.timus.ru/problem.aspx?space=1&num=1109

    题意:

    为了参加即将召开的会议,A国派出M位代表,B国派出N位代表(M,N<=1000),A国代表的编号为1,2,3,...M,B国的代表编号为1,2,3,...N。在召开会议前,选出了K对代表,每代表必须一个是A,一个是B,如果A国代表i 和B国代表j之间构成了一对,则代表i和j之间可以进行谈判,每一个参加会议的代表至少被包含在某一对中,大会中心的CEO想在代表团的房间之间建立直接的电话联系,使得每个代表都至少跟对方代表对的一个代表建立联系,CEO想建立最少的电话联系,给出M,N,K和K对代表,找出需要的最小链接数目

    其实就是一个变相的匈牙利算法,可以这样想,就是在每一个队员的房间了有一根线,如果最直接的就是N+M条电话线,很容易想如果是这样的话,肯定不是最少的连接方式,但是如果使用匈牙利求出最大的匹配数,然后用M+N的减掉匹配数其实就是最后结果了,这样想的话可以想成将A,B中的某两个人的电话线接起来了,每匹配一个就节省了一条,这样算法就很简单了

    其实建模还是很重要的,只要模型建立起来了,再具体到算法就很简单了

    //剖析visit数组????????????????
    
    
    #include <iostream>
    using namespace std;
    int map[1010][1010];   //邻阶矩阵,行和列全部都是点(注意和关联矩阵的区别,关联矩阵行是点,列是边)
    int match[1010];
    bool visit[1010];
    int m,n;
    int dfs(int i){         //判断以X集合中的节点i为起点的增广路径是否存在
    	for(int j=1;j<=n;j++)   //对B组的进行遍历看看是否满足可以匹配且没有被查找
    		if(map[i][j]==1 && visit[j]==0)
    		{
    			visit[j]=1;
    			if( match[j]==0 || dfs( match[j] ))
    			{
    				match[j]=i;
    				return 1;
    			}
    		}
    	return 0;
    		
    }
    
    int main (){
        int k,ans=0,i;
        scanf("%d%d%d",&m,&n,&k);
        memset(match,0,sizeof(match));
        memset(map,0,sizeof(map));
    	int temp1,temp2;
    	while(k--){
    		scanf("%d%d",&temp1,&temp2);
    		map[temp1][temp2]=1;
    	}
    //	cout<<"*****************"<<endl;
        for(i=1;i<=m;i++)   //注意是从1开始的,因为编号是从1开始的
    	{
    		memset(visit,0,sizeof(visit));
    		if(dfs(i))
    			ans++;
    	}
    	printf("%d",m+n-ans);
    	return 0;
    }


     

  • 相关阅读:
    MySql的基本架构续
    MySql的基本架构演变
    多列索引
    索引对单个表查询的影响
    技术在短期内总会被高估,但长期内,总会被低估
    MySql初步II
    验证启用了不安全的HTTP方法
    Struts2漏洞利用实例
    sar命令的使用
    HttpWatch的时间分析
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432044.html
Copyright © 2011-2022 走看看