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 ...
随机推荐
- 移动存储卡仍然用FAT32文件系统的真相
微软在2001年就为自家的XP系统的本地磁盘默认使用了NTFS文件系统,但是12年之后,市面上的USB可移动设备和SD卡等外置存储器仍然在用着FAT32文件格式,这是什么理由让硬件厂商选择过时的文件系 ...
- unity3d 雪与沙的渲染
很简单的一个shader,跟着上一篇地形顺便弄的 方法就是基于物理的diffuse,再加上noise权重的specular 公式参考 JOURNEY JOURNEY中认为OrenNayar比较浪费,所 ...
- leetcode Longest Common Prefix 多个字符串的最长字串
public class Solution { public String get(String a,String b) { if(a==""||b=="") ...
- 把测试app打包成ipa文件
我终于把我的程序放到我的touch上了,其实把app放到touch上还有很多办法,这篇教程是主要讲怎么把app注册了,然后打包成一个ipa文件的. 先上官方文档:https://developer.a ...
- 在Ubuntu中设置中文输入法
在Ubuntu中设置中文输入法 */--> pre { background-color: #2f4f4f;line-height: 1.6; FONT: 10.5pt Consola,&quo ...
- zoj 3659 Conquer a New Region(并查集)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4882 代码: #include<cstdio> #inc ...
- OracleL
DDL : Data Definition Language (DDL) statements are used to define the database structure or schema ...
- 佛山Uber优步司机奖励政策(1月18日~1月24日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Ubuntu 安装vim出错
在Ubuntu 12.10中安装vim时出现了如下提示: www.linuxidc.com @linuxidc:/etc/apt$ sudo apt-get install vim正在读取软件包列表. ...
- Drawing Lines - SGU 135(简单递推)
求N条直线最多能把一个平面分成几部分. 代码如下: ========================================================================== ...