二分匹配的匈牙利算法的dfs实现模板HDU1150 任务分配

这篇博客讨论了一个关于机器任务调度的问题,目标是最小化机器重启次数。给定两台机器A和B,每台机器有多种工作模式,以及一系列任务需要在这两台机器上执行。每个任务需要特定的机器模式。通过使用二分匹配的匈牙利算法实现,该算法以O(N)的时间复杂度找到最优解决方案。博客展示了算法的C++实现,并在每个任务分配后更新机器的重启计数。
摘要由CSDN通过智能技术生成

题目大意:有两台机器A和B,A机器有n种工作方式,B机器有m种工作方式。共有k个任务。每个任务恰好在一条机器上运行。

如果任务在A机器上运行,就需要转换为模式Xi,如果在B机器上运行,就需要转换为模式Yi。

每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。

请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。

​​​​​​​

 

 

//二分匹配匈牙利算法的dfs实现
//时间复杂度为O(N);
//

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int u,v;//a和b的数量
int g[N][N],l[N];//邻接矩阵  存右边对象
bool used[N];//右边对象是否访问过
bool dfs(int a)
{
	for(int b=0;b<v;b++)
	{
		if(g[a][b]&&!used[b])
		{
			used[b]=1;
            //成功的情况有俩种一种是最简单的右边还未分配左边,另一种就是右边已经匹配了,但是左边还可以匹配另一个右边的情况
			if(l[b]==-1||dfs(l[b])) 
			{
				l[b]=a;//给右边对象分配左边对象
				return true;
			}
		}
	}
	return false;//不要省return false 毕竟不是void类型
}
int hungary()
{
	int res=0;
	memset(l,-1,sizeof l);
	for(int a=0;a<u;a++)
	{
		memset(used,0,sizeof used);
		if(dfs(a))
		res++;
	}
	return res;
}
int main()
{
	int k;
	while(cin>>u&&u)
	{
		cin>>v>>k;
		memset(g,0,sizeof g);
		int id,a,b;
		while(k--)
		{
			cin>>id>>a>>b;
			if(a&&b)
			{
				g[a][b]=1;
			}
		}
		cout<<hungary()<<'\n';
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值