网络流24题之飞行员配对方案问题

4 篇文章 0 订阅
3 篇文章 0 订阅

呜。。晚上趁着有空把网络流24题的第一题在本机上A掉了,明早到LJOJ去提交~

裸的二分图最大匹配

网络流做法就是在左边搞个源点,右边搞个汇点

然后源点和左半个图,汇点和右半个图之间连上流量为1的边

左半个图和右半个图之间连上流量为maxlongint的边

然后跑一边最大流就AC辣~~

Code:

const shuru='air.in';
      shuchu='air.out';
var	next,t,sap:array[0..2003] of longint;
	queue,d,cur,headlist:array[0..203] of longint;
	vis:array[0..203] of boolean;
	m,front,finish,num,x,y,i,j,k,n,ans:longint;
procedure init;
begin	
	assign(input,shuru);
	assign(output,shuchu);
	reset(input);
	rewrite(output);
	readln(m,n);
	for i:=1 to m+n+2 do headlist[i]:=-1;
	readln(X,y);
	num:=-1;
	while (x<>-1) and (y<>-1) do
	begin
		inc(num);
		next[num]:=headlist[x];
		headlist[x]:=num;
		t[num]:=y;
		sap[num]:=maxlongint;
		inc(num);
		next[num]:=headlist[y];
		headlist[y]:=num;
		t[num]:=x;
		sap[num]:=0;
		readln(x,y);
	end;
	close(input);
	for i:=1 to m do
	begin
		inc(num);
		next[num]:=headlist[n+m+1];
		headlist[n+m+1]:=num;
		t[num]:=i;
		sap[num]:=1;
		inc(num);
		next[num]:=headlist[i];
		headlist[i]:=num;
		t[num]:=n+m+1;
		sap[num]:=0;
	end;	
	for i:=m+1 to m+n do
	begin
		inc(num);
		next[num]:=headlist[i];
		headlist[i]:=num;
		t[num]:=n+m+2;
		sap[num]:=1;
		inc(num);
		next[num]:=headlist[n+m+2];
		headlist[n+m+2]:=num;
		t[num]:=i;
		sap[num]:=0;
	end;
end;
function BFS:boolean;
var i:longint;
begin
	fillchar(vis,sizeof(Vis),false);
	vis[n+m+1]:=true; queue[1]:=n+m+1; front:=1; finish:=1;
	while finish>=front do
	begin
		i:=headlist[queue[front]];
		while i<>-1 do
		begin
			if not(vis[t[i]]) and (sap[i]>0) then begin
						vis[t[i]]:=true;
						inc(finish);
						queue[finish]:=t[i];
						d[t[i]]:=d[queue[front]]+1;
												  end;
			i:=next[i];
		end;
		inc(Front);
	end;
	exit(vis[n+M+2]);
end;
function min(A,b:longint):longint;
begin
	if a<b then exit(A);
	exit(b);
end;
function DFS(x,a:longint):longint;
var i,flow,f:longint;
begin
	if (x=n+m+2) or (A=0) then exit(a);
	flow:=0;
	i:=cur[x];
	while i<>-1 do
	begin
		if d[t[i]]=d[x]+1 then begin
			f:=dfs(t[i],min(a,sap[i]));
			if f>0 then begin
							flow:=flow+f;
							sap[i]:=sap[i]-f;
							sap[i xor 1]:=sap[i xor 1]+f;
							a:=a-f;
							if a=0 then break;
						end;
							  end;
		i:=next[i];
		cur[x]:=i;
	end;
	if flow=0 then d[x]:=-1;
	exit(flow);
end;
procedure main;
begin
	init;
	while BFS do
	begin
		for i:=1 to n+m+2 do cur[i]:=headlist[i];
		ans:=ans+dfs(n+m+1,maxlongint);
	end;
	writeln(Ans);
	close(output);
end;
begin
	main;
end.



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值