Ural 1997-Those are not the droids you're looking for 二分图匹配

本文通过一道编程题解析了匈牙利算法的应用过程。题目要求找出最佳匹配方案,利用DFS深度优先搜索寻找增广路径来实现。代码实现了从输入到匹配结果输出的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

挺水的一道模板题让我硬生生错了10发,不想说什么了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a,b;
int n;
int t,d;
int count1,count2;
bool visit[1111];
int p[1111],q[1111];
int link[1111];
bool map[1111][1111];
bool dfs(int k)//寻找从k出发的可增广路 
{
	int i,j;
	for(int i=1;i<=count2;i++)
	{
		if(map[k][i]&&!visit[i])//和cap关联的点,且不在增广路上 
		{
			visit[i]=1;//加入增广路 
			j=link[i];
			if(j==-1||dfs(j))//j是未盖点 或者 从j的对应项出发有可增广路) 
			{
				link[i]=k;
				return true;//k有可增广路,返回true;
			}
		}
	}
	return false;//则从k没有可增广路,返回false;
}
int hungary()
{
	int num=0;
	memset(link,-1,sizeof(link));//初始化 
	for(int i=1;i<=count1;i++)
	{
		memset(visit,0,sizeof(visit));
		if(dfs(i))//有增广路 
		{
			num++;//匹配数++ 
		}
	}
	return num;
}
int main()
{
	   count1=0;count2=0;
	    scanf("%d%d",&a,&b);
		scanf("%d",&n);
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		memset(map,0,sizeof(map));
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&t,&d);
			if(d==0)
			{
				count1++;
				p[count1]=t;
			}
			else
			{
				count2++;
				q[count2]=t;
			}
		}
		for(int i=1;i<=count1;i++)
		{
			for(int j=1;j<=count2;j++)
			{
				if(p[i]>=q[j]) continue;//进去时间必须小于出去的时间 
				int cnt=q[j]-p[i];
				if(cnt<=b||cnt>=a)//不加上面那个判断存在cnt<0的情况 
				{
					map[i][j]=1;
				}
			}
		}
		int ans=hungary();
		if(ans*2!=n)
		{
			printf("Liar\n");
		}
		else
		{
			 printf("No reason\n");
			for(int i=1;i<=count2;i++)
			{
				printf("%d %d\n",p[link[i]],q[i]);
			}
		}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值