【二分图+最小覆盖+简单题】杭电 hdu 1054 Strategic Game

/* THE PROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
    Copyright (c) 2011 panyanyany All rights reserved.

    URL   : http://acm.hdu.edu.cn/showproblem.php?pid=1054
    Name  : 1054 Strategic Game

    Date  : Monday, November 7, 2011
    Time Stage : half an hour

    Result: 
4922857	2011-11-07 20:16:34	Accepted	1054
703MS	336K	1378 B
C++	pyy


Test Data :

Review :
写完了代码,案例不通过,观摹了majia大神的代码,发现原来要构造双向图……
//----------------------------------------------------------------------------*/

#include <stdio.h>
#include <vector>

using std::vector ;

#define MAXSIZE 1509

int		n ;
int		link[MAXSIZE], cover[MAXSIZE] ;

vector<int> adj[MAXSIZE] ;

int find (int cur)
{
	int i, j ;
	for (i = 0 ; i < adj[cur].size () ; ++i)
	{
		j = adj[cur][i] ;
		if (cover[j] == false)
		{
			cover[j] = true ;
			if (link[j] == -1 || find (link[j]))
			{
				link[j] = cur ;
				return 1 ;
			}
		}
	}
	return 0 ;
}

int main ()
{
	int i, j ;
	int x, id, cnt ;
	int sum ;

	while (~scanf ("%d", &n))
	{
		for (i = 0 ; i < n ; ++i)
		{
			scanf ("%d:(%d)", &id, &cnt) ;
			if (cnt)
				for (j = 0 ; j < cnt ; ++j)
				{
					scanf ("%d", &x) ;
					adj[id].push_back (x) ;
					adj[x].push_back (id) ; // 构造双向图
				}
		}

		sum = 0 ;
		memset (link, -1, sizeof (link)) ;
		for (i = 0 ; i < n ; ++i)
		{
			memset (cover, 0, sizeof (cover)) ;
			sum += find (i) ;
		}

		printf ("%d\n", sum / 2) ;

		for (i = 0 ; i < n ; ++i)
			adj[i].clear () ;
	}
	return 0 ;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写代码的安徒生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值