HDOJ 1150 Machine Schedule 二分匹配

2024-05-10 12:18

本文主要是介绍HDOJ 1150 Machine Schedule 二分匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

模型建立:机器A的n个状态表示成X集合中得n个点,机器B的m个状态表示成Y集合的m个点。当一个任务可以用机器A的i状态,和机器B的j状态解决的时候,我们连接X集合中的第i个结点和Y集合中的第j个结点。所有的任务都完成意味着所有的边都被选择到。因此这个题就变成求最小覆盖点集,即最大匹配数。注意,我们不考虑能用机器A或机器B的0状态来解决的任务,因为这样的任务一开始就都被解决了。

#include<iostream>   
using namespace std;  
const int MAX = 102;  
bool linkMap[MAX][MAX];  
int  crossPath[MAX];  
bool used[MAX];  
int n, m;  
bool search(int u)  
{  for (int i=1;i<m;i++)  {  if (linkMap[u][i]&&!used[i])  {  used[i]=1;//保证路径上无重复点出现   if (crossPath[i]==-1||search(crossPath[i]))  {  crossPath[i]=u;//①增广路径的取反   return true;  }  }  }  return false;  
}  int hungary()  
{  int cnt = 0;   memset(crossPath, -1, sizeof(crossPath));  for(int i= 1; i<n; i++)  {  memset(used,0, sizeof(used));  if(search(i))   cnt++;  }  return cnt;  
}  
int main()  
{  //ifstream cin("Machine Schedule.txt");   int k;  while(cin>>n,n)  {  cin>>m>>k;  memset(linkMap,false, sizeof(linkMap));    for(int i =0; i < k; i++)   {   int v1, v2;      cin>>v1>>v1>>v2;  if(v1&&v2)  linkMap[v1][v2] = true;    }  cout<<hungary()<<endl;  }  return 0;  
}


这篇关于HDOJ 1150 Machine Schedule 二分匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/976421

相关文章

编译测试后出现“发现不明确的匹配”错误

原文链接:http://blog.163.com/zhaoyanping_1125/blog/static/201329153201204218533/ 错误提示: 【“/”应用程序中的服务器错误。  分析器错误 说明: 在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件。  分析器错误信息: 发现不明确的匹配。】   这个问题发生原因一般情况是

linux匹配Nginx日志,某个字符开头和结尾的字符串

匹配 os=1 开头, &ip结尾的字符串 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ 存入日志。然后使用submit 前面和后面的值去掉,剩下就是需要的字符串。 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ >log.log

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

关于eclipse上运行jsp文件的问题--tomcat与JDK的匹配

建立 jsp 文件前,先进行 tomcat  与 JDK 的下载、安装与配置: 1、JDK下载后安装; 2、JDK的配置: JAVA_HOME:       c:/jdk7.0.54(JDK的安装目录) classpath:         .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar path:      %JAVA_HOME%\

nginx将泛解析的匹配域名绑定到子目录配置方法

应用场景: http://zzl.lteam.cn/ 访问/usr/local/boke/lteam.cn/zzl 目录下的 index.html http://lj.lteam.cn/ 访问/usr/local/boke/lteam.cn/lj 目录下的 index.html 目录结构: /usr/local/boke/ ├── lteam.cn│ └── zzl│

leetcode 二分查找·系统掌握 第一个错误版本

题意: 题解: 就是经典的~01~泛型查找,而且一定存在这样错误的版本所以查找不会"失败",返回每次查找结果即可。 int firstBadVersion(int n) {long l=1,r=n,mid;while(l<r){mid=(l+r)>>1;if(isBadVersion(mid))r=mid;else l=mid+1;}return l;}

leetcode 二分查找·系统掌握 搜索二维矩阵

题目: 题解: 一个可行的思路是使用~01~泛型对每一行的最后一个元素进行查找找到第一个大于等于target的那一行,判断查找结果如果“失败”返回false否则继续在改行进行常规二分查找target的值根据查找结果返回即可。 bool searchMatrix(vector<vector<int>>& matrix, int target) {int l=0,r=matrix.size()-

微策略面试题:在旋转后的数组中查找元素(二分查找)

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/17123303 一个无重复元素的有序数组,经过若干次旋转后,得到一个新数组。比如[1,4,5,8,10,12,56,78]变成[12,56,78,1,4,5,8,10]。 现在要在这个数组中寻找元素。 其实算法很简单,就是用二分