博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1719
阅读量:6040 次
发布时间:2019-06-20

本文共 1949 字,大约阅读时间需要 6 分钟。

二分图匹配

题意:给定一个r*c的棋盘,其中每列有2个白色格子,其余为黑色。要求选出c个白色格子,且每列一个,且每行至少一个。问能否实现,给出方案。

分析:如果r>c则必定无法满足,因为即使每列一个,均位于不同行,还是会有某些行没有被选中的格子。对于其余情况,先进行简单的二分图匹配(每行作为1点构成第一点集,每列作为1点构成第二点集,每个白色格子作为连接其行列点的边),如果每行都能匹配上则首先可以保证每行都有选中的格子,当然此时可能有一些列还有没有被选中的格子,只要在该列里随便选1个白的就行了,不会影响结果。

View Code
#include 
#include
#include
#include
using namespace std; #define maxn 1005 int uN, vN; bool g[maxn][maxn]; int xM[maxn], yM[maxn]; bool chk[maxn]; bool SearchPath(int u) {
int v; for (v = 0; v < vN; v++) if (g[u][v] && !chk[v]) {
chk[v] = true; if (yM[v] == -1 || SearchPath(yM[v])) {
yM[v] = u; xM[u] = v; return true; } } return false; } int MaxMatch() {
int u, ret = 0; memset(xM, -1, sizeof(xM)); memset(yM, -1, sizeof(yM)); for (u = 0; u < uN; u++) {
if (xM[u] == -1) memset(chk, false, sizeof(chk)); if (SearchPath(u)) ret++; } return ret; } void input() {
scanf("%d%d", &uN, &vN); memset(g, 0, sizeof(g)); for (int i = 0; i < vN; i++) {
int a, b; scanf("%d%d", &a, &b); a--; b--; g[a][i] = g[b][i] = true; } } void work() {
if (uN > vN) {
printf("NO\n"); return; } int ans = MaxMatch(); if (ans != uN) {
printf("NO\n"); return; } if (yM[0] != -1) printf("%d", yM[0] + 1); else {
int j = 0; while (!g[j][0]) j++; printf("%d", j + 1); } for (int i = 1; i < vN; i++) {
if (yM[i] != -1) {
printf(" %d", yM[i] + 1); continue; } int j = 0; while (!g[j][i]) j++; printf(" %d", j + 1); } } int main() {
//freopen("t.txt", "r", stdin); int t; scanf("%d", &t); while (t--) {
input(); work(); putchar('\n'); } return 0; }

转载地址:http://kwghx.baihongyu.com/

你可能感兴趣的文章
【Java集合源码剖析】ArrayList源码剖析
查看>>
linux的目录结构
查看>>
这次逻辑通了,
查看>>
HTMLHelper
查看>>
快速构建Windows 8风格应用29-捕获图片与视频
查看>>
OC语言Block和协议
查看>>
使用xpath时出现noDefClass的错误(找不到某个类)
查看>>
.Net规则引擎介绍 - REngine
查看>>
CSS3 transforms 3D翻开
查看>>
利用传入的Type类型来调用范型方法的解决方案
查看>>
Top命令内存占用剖析
查看>>
转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
查看>>
求带分数(蓝桥杯)
查看>>
Bootstrap系列 -- 11. 基础表单
查看>>
Retrofit 入门学习
查看>>
Spring Boot学习笔记
查看>>
python3存入redis是bytes
查看>>
laravel 集合接口
查看>>
C/C++二进制读写png文件
查看>>
thymleaf 常用th 标签
查看>>