【二分图+最小覆盖+简单题】杭电 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 ; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值