SGU 190.Dominoes(二分图匹配)
时间限制:0.25s
空间限制:4M
题意:
给定一个N*N的棋盘,一些格子被移除,在棋盘上放置一些1*2的骨牌,判定能否放满,并且输出任意方案。
Solution:
首先考虑对棋盘的一个格子黑白染色(实际上不需要),得到一个类似国际象棋棋盘的东西,一个骨牌能放置在相邻的一对黑白格子上
我们考虑对每一个黑格子,连一条到相邻白色格子的边,然后做二分图的最大匹配,判断是否是完备匹配,输出解即可。
思路比较简单直接,输出需要一些简单技巧和小处理。
code
#include <iostream>
#include <cstring>
#include <fstream>
#include <cmath>
#include <cstdio>
using namespace std;
const int INF = ;
struct node {
int u, v, next;
} edge[];
int pHead[INF], vis[INF], pr[INF];
int dx[] = {, , , -}, dy[] = {, -, , };
int n, m, x, y, nCnt, an;
int exPath (int x) {
for (int k = pHead[x]; k != ; k = edge[k].next) {
int x = edge[k].u, y = edge[k].v;
if (!vis[y]) {
vis[y] = ;
if ( !pr[y] || exPath (pr[y]) ) return pr[y] = x;
}
}
return ;
}
void addEdge (int u, int v) {
edge[++nCnt].u = u, edge[nCnt].v = v;
edge[nCnt].next = pHead[u];
pHead[u] = nCnt;
}
int g[][];
int main() {
//ofstream cout("out.txt");
cin >> n >> m;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) g[i][j] = ;
for (int i = ; i <= m; i++) {
cin >> x >> y;
g[x][y] = ;
}
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++) {
if (g[i][j])
for (int k = ; k < ; k++) {
int x = i + dx[k], y = j + dy[k];
if (g[x][y])
addEdge ( (i - ) *n + j, (x - ) *n + y);
}
}
for (int i = ; i <= n * n; i++) {
if (exPath (i) ) an++;
memset (vis, , sizeof vis);
}
int t1 = , t2 = ;
int ans[][INF];
for (int i = ; i <= n * n; i++) {
if (pr[i] && !vis[i]) {
vis[i] = vis[pr[i]] = ;
if (abs (pr[i] - i) == n)
ans[][++t1] = min (i, pr[i]);
else
ans[][++t2] = min (i, pr[i]);
}
}
if (an == (n * n - m) ) {
cout << "Yes" << endl;
cout << t1 << endl;
for (int i = ; i <= t1; i++) {
int l, r;
if (ans[][i] % n) l = ans[][i] / n + , r = ans[][i] % n;
else
l = ans[][i] / n, r = n;
cout << l << ' ' << r << endl;
}
cout << t2 << endl;
for (int i = ; i <= t2; i++) {
int l, r;
l = ans[][i] / n + , r = ans[][i] % n;
cout << l << ' ' << r << endl;
}
}
else
cout << "No";
return ;
}
SGU 190.Dominoes(二分图匹配)的更多相关文章
- Codeforces 739D - Recover a functional graph(二分图匹配)
Codeforces 题面传送门 & 洛谷题面传送门 首先假设我们已经填好了所有问号处的值怎样判断是否存在一个合法的构造方案,显然对于一种方案能够构造出合法的基环内向森林当且仅当: \(\fo ...
- UVA 12549 - 二分图匹配
题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...
- POJ 1274 裸二分图匹配
题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2375 Solved: 1005[Submit][Sta ...
- HDU1281-棋盘游戏-二分图匹配
先跑一个二分图匹配,然后一一删去匹配上的边,看能不能达到最大匹配数,不能这条边就是重要边 /*----------------------------------------------------- ...
- HDU 1083 网络流之二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...
- hdu 5727 Necklace dfs+二分图匹配
Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...
- BZOJ 1059 & 二分图匹配
题意: 判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色. SOL: 真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够 ...
- 【POJ 3020】Antenna Placement(二分图匹配)
相当于用1*2的板覆盖给定的h*w的格子里的点,求最少的板.可以把格子相邻的分成两个集合,如下图,0为一个集合,1的为一个,也就是(行数+列数)为奇数的是一个集合,为偶数的为另一个集合.1010101 ...
随机推荐
- (转载)mysql中limit用法
(转载)http://hi.baidu.com/sppeivan/item/e45179375d6778c62f8ec221 mysql中limit用法 使用查询语句的时候,经常要返回前几条或者中 ...
- 连接池 BoneCPDataSource
一篇连接池不错的文章 http://blog.csdn.net/vincent_czz/article/details/7646392
- HDU --3549
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- removeTask
SystemUI中,Home键调出小刷子杀最近任务,整个流程从其RecentsPanelView.java开始: public void handleSwipe(View view) { ... // ...
- poj 2425 A Chess Game(SG函数)
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3551 Accepted: 1440 Desc ...
- 折腾iPhone的生活——iPhone 5s 开启 assistive touch 后卡顿的问题
刚刚入手我的国行iPhone5s土狗灰,感觉倍棒~ 但是一上手就发现了一个问题:卡顿. 卡顿不仅体现在日常使用中,游戏中更加严重,当我玩水果忍者的时候,会发现切水果的画面都变得不流畅起来,这是拥有64 ...
- java 启用新线程异步调用
2秒后执行 某段代码: demo如下: System.out.println("正常执行...111"); Thread t = new Thread(){ public void ...
- Docker的基本操作
容器基本操作 1.启动容器 $docker run image [COMMAND] [ARG…] run在新容器中执行命令 2.启动交互式容器 $docker run -i -t IMAGE /bin ...
- Unity NGUI UILabel文字变色 及相关问题
在同一个UILabel中可以有不同颜色的文字只需要添加BBCode标记[ff0000]Red Label[-],那么在这个标记之间的RedLabel 就会变成红色 注意: 1.文本最终显示的颜色=Co ...
- shell 获取网关 以及修改ip 启用网卡
shell 获取网关 以及修改ip 启用网卡 #!/bin/bash #autho freefei #script is a init computer eth #data 2014 10 09 19 ...