hdu 1054 Strategic Game

本文介绍了一种解决最小顶点覆盖问题的方法——匈牙利算法,通过添加反向边将单向图转化为双向图,利用邻接表优化算法效率,最终计算出最小顶点覆盖为最大匹配的两倍。

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

最小顶点覆盖!匈牙利算法

最小顶点覆盖 == 最大匹配(双向图)/2; (题目给的是单向的,添加反向边就行了)

此题有个小细节,数据较大,邻接矩阵会超时,要用邻接表! 用的是数组模拟的,250MS。

#include<iostream>

using namespace std;

int n;
int count;
int ok[1510];
int Right[1510];

int m;
int from,to;

int head[1510];
int ID;
struct Edge
{
	int u;
	int v;
	int next;
}e[20000];

bool path(int k);

int main()
{
	while(cin>>n)
	{
		memset(ok,-1,sizeof(ok));
		count=0;

		for(int i=0;i<n;i++)
			head[i]=-1;

		ID=0;

		for(i=0;i<n;i++)
		{
			scanf("%d:(%d)",&from,&m);

			for(int j=0;j<m;j++)
			{
				scanf("%d",&to);
				e[ID].u=from;
				e[ID].v=to;
				e[ID].next=head[from];
				head[from]=ID++;

				e[ID].u=to;
				e[ID].v=from;
				e[ID].next=head[to];
				head[to]=ID++;
			}
		}

		for(i=0;i<n;i++)
		{
			memset(Right,0,sizeof(Right));
			if(path(i))
				count++;
		}

		cout<<count/2<<endl;
	}
	return 0;
}

bool path(int k)
{
	for(int i=head[k];i!=-1;i=e[i].next)
	{
		if(Right[e[i].v]==0)
		{
			Right[e[i].v]=1;
			if( ok[e[i].v]==-1 || path(ok[e[i].v]) )
			{
				ok[e[i].v]=k;
				return true;
			}
		}
	}
	return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值