【二分图+最小路径覆盖】北大 poj 3020 Antenna Placement

本文介绍了一个关于天线放置问题的程序设计题解。该问题要求找到最小路径覆盖(或最大独立集)的解决方案,并通过二分图匹配算法实现。代码使用C++编写,最终成功通过评测。

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


/* THE PROGRAM IS MADE BY PYY */ /*----------------------------------------------------------------------------// Copyright (c) 2011 panyanyany All rights reserved. URL : http://poj.org/problem?id=3020 Name : 3020 Antenna Placement Date : Thursday, December 8, 2011 Time Stage : one hour Result: 9644820 panyanyany 3020 Accepted 184K 0MS C++ 1588B 2011-12-08 20:31:01 Test Data : Review : 不知道为什么是最小路径覆盖(也有一种说法是最大独立集),不理解,求大牛指点…. 我看到很多人是把它转化为一个标准的二分图来做的……这其实也是一种思路,不过我觉得 那样有点麻烦,就没有去做……貌似也是因为我没有想到这样做…… //----------------------------------------------------------------------------*/ #include <stdio.h> #include <string.h> #define MAXSIZE 43 struct POINT { int x, y ; }; int n, h, w ; bool cover[MAXSIZE][MAXSIZE] ; char map[MAXSIZE][MAXSIZE] ; char dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1} ; POINT link[MAXSIZE][MAXSIZE] ; bool find (int py, int px) { int i, j ; int x, y ; for (i = 0 ; i < 4 ; ++i) { y = py + dir[i][0] ; x = px + dir[i][1] ; if ((0 < x && x <= w && 0 < y && y <= h) && !cover[y][x] && (map[y][x] == '*')) { cover[y][x] = true ; if (!link[y][x].x || find (link[y][x].y, link[y][x].x)) { link[y][x].y = py ; link[y][x].x = px ; return true ; } } } return false ; } int main () { int i, j ; int x, y ; int sum, cnt ; while (~scanf ("%d", &n)) { while (n--) { scanf ("%d%d", &h, &w) ; for (j = 1 ; j <= h ; j++) { scanf ("%s", &map[j][1]) ; } sum = cnt = 0 ; memset (link, 0, sizeof (link)) ; for (j = 1 ; j <= h ; ++j) for (i = 1 ; i <= w ; ++i) { if (map[j][i] == '*') { ++ cnt ; memset (cover, 0, sizeof (cover)) ; sum += find (j, i) ; } } printf ("%d\n", cnt - sum / 2) ; } } return 0 ; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值