G - Oil Skimming - hdu 4185(二分图匹配)
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int MAXN = 40005;///处理后点的个数
const int MAXM = 605;///原图大小
const int oo = 1e9+7; char G[MAXM][MAXM]; int N;///保存原图
int Index[MAXM][MAXM];///给石油点编号 struct Edge{int v, next;}e[MAXN*4];
int Head[MAXN], cnt;///处理后的边 int Mx[MAXN], My[MAXN];///记录与之匹配的点
int used[MAXN], dx[MAXN], dy[MAXN];///dx,dy记录BFS后的层次
int depth, NX;///宽搜的深度,和点的个数 void InIt()
{///初始化
NX = cnt = 0; memset(Head, -1, sizeof(Head));
memset(Mx, false, sizeof(Mx));
memset(My, false, sizeof(My));
}
void AddEdge(int u, int v)
{///添加边
e[cnt].v = v;
e[cnt].next = Head[u];
Head[u] = cnt++;
}
bool BFS()
{///广搜求出层次,并且判断是否有增广路存在
queue<int> Q;
depth = oo; memset(dx, false, sizeof(dx));
memset(dy, false, sizeof(dy)); for(int i=1; i<=NX; i++)
{
if( Mx[i] == false )
{
dx[i] = true;
Q.push(i);
}
} while(Q.size())
{
int u = Q.front(); Q.pop(); if( dx[u] > depth )break;///已经发现上层存在增广路 for(int j=Head[u]; j!=-1; j=e[j].next)
{
int v = e[j].v;
if( dy[v] == false )
{
dy[v] = dx[u] + 1; if(My[v] == false)
depth = dy[v];
else
{
dx[ My[v] ] = dy[v] + 1;
Q.push( My[v] );
}
}
}
} return depth != oo;
}
bool DFS(int i)
{
for(int j=Head[i]; j!=-1; j=e[j].next)
{
int v = e[j].v; if( used[v] == false && dx[i] == dy[v]-1 )
{
used[v] = true;///开始忘记置为true,错了一次
if( My[v] && dy[v] == depth )
continue;
if( !My[v] || DFS(My[v]))
{
My[v] = i;
Mx[i] = v; return true;
}
}
} return false;
}
int Karp()
{
int ans = 0; while( BFS() == true )
{
memset(used, false, sizeof(used));
for(int i=1; i<=NX; i++)
{
if( !Mx[i] && DFS(i) )
ans++;
}
} ///因为点同时在两边,所以会重复一次,结果应该出去 2
return ans / 2;
} int main()
{
int i, j, T, t=1; scanf("%d", &T); while(T--)
{
scanf("%d", &N); InIt(); for(i=0; i<N; i++)
{
scanf("%s", G[i]);
for(j=0; j<N; j++)
{
if(G[i][j] == '#')
{///购置关系图
Index[i][j] = ++NX;///给石油编号 if(j != 0 && G[i][j-1] == '#')
{///与左边的可以匹配
AddEdge(Index[i][j], Index[i][j-1]);
AddEdge(Index[i][j-1], Index[i][j]);
} if(i != 0 && G[i-1][j] == '#')
{///与上面的可以匹配
AddEdge(Index[i][j], Index[i-1][j]);
AddEdge(Index[i-1][j], Index[i][j]);;
}
}
}
} int ans = Karp(); printf("Case %d: %d\n", t++, ans);
} return 0; }
G - Oil Skimming - hdu 4185(二分图匹配)的更多相关文章
- Oil Skimming HDU - 4185(匹配板题)
Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- (匹配)Oil Skimming -- hdu --4185
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4185 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 4185 二分图匹配
题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 .... ...
- hdu 1281 二分图匹配
题目:在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下.但是某些格子若不放子,就 无法保证放尽量多的“车”,这样的格子被称做重要点 ...
- hdu 2063 二分图匹配
题意:一些女的和一些男的有好感,有好感的能一起坐过山车,问最多能组成多少对 hdu 11 页上少有的算法题,二分图匹配问题,匈牙利算法,对于每一个汉子,看和他有好感的妹子有没有配对了,没有配对过就可以 ...
- hdu 4185 二分图最大匹配
Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 1507(二分图匹配)
Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 过山车 HDU 2063 (二分图匹配裸题)
Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生 ...
- Land of Farms HDU - 5556 二分图匹配
Farmer John and his brothers have found a new land. They are so excited and decide to build new farm ...
随机推荐
- IDL绘制黑体辐射曲线
普朗克定律是热红外遥感中常常使用的三大定律之一,描述了黑体辐射能量的情况.绝对黑体的辐射光谱对于研究一切物体的辐射规律具有根本的意义.1900年普朗克引进量子概念,将辐射当做不连续的量子发射,成功地从 ...
- python----------反射和设计模式
反射: 把字符串映动态射成对象内存地址. hasattr():判断一个对象里是否有对应的字符串的方法 getattr():根据字符串去获取obj对象里的对应方法的内存地址. class Dog(obj ...
- python运算符使用规律
#conding=utf-8 #优先级使用规律#1.一般情况下是左右结合print 4+6+5*6+6 #2.出现赋值的时候一般是右结合a=8+91print a #优先级记忆口诀'''函数寻址下标1 ...
- UWP app HelloWorld 的创建
步骤 1:在 Visual Studio 中创建新项目 启动 Visual Studio 2015 RC.将出现 Visual Studio 2015 RC 起始页. (从现在开始,我们将 Visua ...
- editplus双击单词语法高亮显示设置
view=>Word Highlighting
- phonegap 2.8.1 toast
目录结构如下: 以上三个用红色框勾出的地方是需要修改的文件夹. 首先:添加java代码. 在src目录下新建一个包裹:org.apache.cordova 在该包裹下新建类:ToastPlugin.j ...
- 使用top工具,找出消耗CPU 较多的进程
1.使用top工具,找出消耗CPU 较多的进程 [oracle@cuug ~]$ top top - 10:48:27 up 23:15, 4 users, load average: 1.09, ...
- 无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) 解决方案
使用SQL2012附加一个数据库时报出了以下错误:“无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539).不能打开与此版本的 sqlserver.exe 不兼 ...
- eclipse设置和优化
1.eclipse下的编码设置: eclipse 中使用模板新建 JSP,xhtml等 文件时,默认的编码为:ISO-8859-1. ISO-8859-1 编码对于中文的显示是不支持的,如果要支持简体 ...
- [转]Delphi : keydown与keypress的区别,组合键
Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDoubl ...