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 ...
随机推荐
- C#HttpWebResponse请求常见的状态码
成员名称 说明 Continue 等效于 HTTP 状态 100.Continue 指示客户端可能继续其请求. SwitchingProtocols 等效于 HTTP 状态 101.Switching ...
- Android开发手记(15) 拨打电话和收发短信
1.Intent简介 Android组价之间的通信,由Intent来协助完成.Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到 ...
- NOI 191钉子和小球.cpp
#include<iostream> #include<cstdio> #include<cstring> using namespace std; ][]; in ...
- POJ 2674 Linear world
POJ 2674 Linear world 题目大意: 一条线上N只蚂蚁,每只蚂蚁速度固定,方向和坐标不同,碰头后掉头,求最后掉下去那只蚂蚁的时间和名字. 注意两点: 相撞可视为擦肩而过,蚂蚁们不管掉 ...
- inputtype
<EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...
- ubuntu系统mysql.h no such file or directory
在Ubuntu系统中,你已经安装了mysql,即你使用sudo apt-get install mysql-server mysql-client然而使用C语言访问mysql数据库时,却发现出现了如下 ...
- Linq介绍
什么是LINQ? LINQ全称Language Integrated Query,中文翻译"语言集成查询".在.NET框架中,大致使用三大组件实现这个封装,分别 LINQ to O ...
- extjs中datefield组件的使用
xtype: 'datefield', id: 'dateShangmfa', name: 'dateShangmfa', fieldLabel: '日期',//设置标签文本 editable: fa ...
- angularJS中如何写服务
服务的用途 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性 服务提供了把特定功能相关联的方法集中在一起的接口 如何创建服务 angularJS ...
- js中的 window.location、document.location、document.URL 对像的区别(转载)
原文:http://www.cr173.com/html/18417_1.html 当我们需要对html网页进行转向的时候或是读取当前网页的时候可以用到下面三个对像: window.location. ...