博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1325 Machine Schedule ——二分图最小覆盖——Pku1325
阅读量:7191 次
发布时间:2019-06-29

本文共 1307 字,大约阅读时间需要 4 分钟。

二分图最小覆盖:找到一个点集,使得每条边上至少有一个点在该集合中。

证明二分图最小覆盖=二分图最大匹配:

二分图最大匹配后,每个点都不能找到增广路,而找不到增广路的原因就是至少有一个点已经被匹配了。即这个点在二分图的最大匹配中。而二分图最大匹配中会存在同一条边两个点都在这个点集中的情况,我们只要取一个点即可。

 

本题当中,将机器A上的模式看作X集合,机器B上的模式看作Y集合,每个任务对应一条边,两点分别为在A,B上的模式,建立二分图。可以看出,最小的重新启动次数就是二分图的最小覆盖——即最大匹配。普通匈牙利算法即可。

Hint:注意一点:读入时要加上这样一句话,否则会WA:

if p*q=0 then continue;

 

CODE

Program POJ1325;//By_ThispoetConst	maxn=100;Var	i,j,m,n,p,q,k,ans					:Longint;	pre,other,last						:Array[0..maxn*10]of Longint;	res									:Array[0..maxn]of Longint;	state								:Array[0..maxn]of Boolean;Function Dfs(i:Longint):Boolean;var j,k:Longint;begin	j:=last[i];	while j<>0 do		begin			k:=other[j];			if not state[k] then				begin					state[k]:=true;					if (res[k]=0)or(Dfs(res[k]))then						begin							res[k]:=i;							exit(true);						end;				end;			j:=pre[j];		end;	exit(false);end;BEGIN	readln(n,m,k);	while n<>0 do 		begin					fillchar(last,sizeof(last),0);			for i:=1 to k do				begin					readln(j,p,q);					if p*q=0 then continue;					pre[i]:=last[p];last[p]:=i;other[i]:=q;				end;			ans:=0;			fillchar(res,sizeof(res),0);			for i:=1 to n do				begin					fillchar(state,sizeof(state),0);					if Dfs(i) then inc(ans);				end;						writeln(ans);						read(n);			if n<>0 then readln(m,k);					end;END.

转载于:https://www.cnblogs.com/Thispoet/archive/2011/09/14/2175399.html

你可能感兴趣的文章
JavaScript-事件周期-点击替换颜色
查看>>
c# 遍历文件夹及其所有文件
查看>>
电商2.0时代
查看>>
关于 Android 程序员最近的状况
查看>>
虚拟化之lxc
查看>>
Java 包装类 自动装箱和拆箱
查看>>
利用ExpandableListView和gridview 显示可展开折叠菜单导航
查看>>
再看tp
查看>>
SQL Server 2012 还原选项的变化
查看>>
细节之处方显linux真功夫
查看>>
谈谈SQL Server高可用的常见问题
查看>>
Provisioning Services 7.8 入门系列教程之六 手动添加设备
查看>>
技术大牛对程序员招聘的吐槽和建议
查看>>
《未来架构师》的教学范例(2)
查看>>
Exchange 混合部署—Exchange 2007到Exchange 2013迁移
查看>>
C++构造函数和析构函数的学习(一)
查看>>
Redhat更新yum源
查看>>
jmeter企业内训简报
查看>>
你知道测试大牛怎么写测试计划的吗?
查看>>
ios程序在ios5下出现黑屏的问题
查看>>