题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26864

思路:首先是spfa预处理出每个'G'到'H'的最短距离,然后就是二分最大距离,最大匹配验证即可。

PS:这道题一开始没什么思路,然后想先最简单的spfa预处理写一下吧,然后写着写着就突然豁然开朗,有思路了!然后就AC了!

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define MAXN 55
#define inf 1<<30
#define FILL(a,b) memset(a,b,sizeof(a)) vector<pair<int,int> >g,h; int n,dir[][]={{-,},{,},{,-},{,}};
int dist[MAXN][MAXN],dd[MAXN][MAXN];
bool mark[MAXN][MAXN];
char map[MAXN][MAXN]; void spfa(int vs)
{
FILL(mark,false);
for(int i=;i<MAXN;i++)
for(int j=;j<MAXN;j++)dd[i][j]=inf;
queue<pair<int,int> >que;
que.push(make_pair(g[vs].first,g[vs].second));
dd[g[vs].first][g[vs].second]=;
while(!que.empty()){
pair<int,int>p=que.front();
que.pop();
mark[p.first][p.second]=false;
for(int i=;i<;i++){
int x=p.first+dir[i][],y=p.second+dir[i][];
if(x>=&&x<n&&y>=&&y<n&&map[x][y]!='#'){
if(dd[p.first][p.second]+<dd[x][y]){
dd[x][y]=dd[p.first][p.second]+;
if(!mark[x][y]){
mark[x][y]=true;
que.push(make_pair(x,y));
}
}
}
}
}
} vector<int>gg[MAXN];
void Build(int limit)
{
for(int i=;i<MAXN;i++)gg[i].clear();
for(int i=;i<g.size();i++){
for(int j=;j<h.size();j++){
if(dist[i][j]<=limit)gg[i].push_back(j);
}
}
} int ly[MAXN];
bool vis[MAXN]; int dfs(int u)
{
for(int i=;i<gg[u].size();i++){
int v=gg[u][i];
if(!vis[v]){
vis[v]=true;
if(ly[v]==-||dfs(ly[v])){
ly[v]=u;
return ;
}
}
}
return ;
} int MaxMatch()
{
int res=;
FILL(ly,-);
for(int i=;i<g.size();i++){
FILL(vis,false);
res+=dfs(i);
}
return res;
} int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--){
scanf("%d",&n);
g.clear();
h.clear();
for(int i=;i<n;i++)scanf("%s",map[i]);
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(map[i][j]=='G')g.push_back(make_pair(i,j));
else if(map[i][j]=='H')h.push_back(make_pair(i,j));
}
}
for(int i=;i<MAXN;i++)
for(int j=;j<MAXN;j++)dist[i][j]=inf;
for(int i=;i<g.size();i++){
spfa(i);
for(int j=;j<h.size();j++){
if(dd[h[j].first][h[j].second]!=inf)dist[i][j]=min(dist[i][j],*dd[h[j].first][h[j].second]+);
}
}
int low=inf,high=,mid,ans=inf;
for(int i=;i<g.size();i++){
for(int j=;j<h.size();j++){
if(dist[i][j]!=inf){
low=min(low,dist[i][j]);
high=max(high,dist[i][j]);
}
}
}
while(low<=high){
mid=(low+high)>>;
Build(mid);
if(MaxMatch()==(int)h.size()){
ans=mid;
high=mid-;
}else
low=mid+;
}
printf("Case %d: ",t++);
if(ans!=inf){
printf("%d\n",ans);
}else
puts("Vuter Dol Kupokat");
}
return ;
}

loj 1150(spfa预处理+二分+最大匹配)的更多相关文章

  1. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

  2. hdu 4568 Hunter(spfa预处理 + 状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...

  3. hdu2063 匈牙利算法 二分最大匹配模版题

    过山车 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class na ...

  4. POJ 3041 Asteroids(模板——二分最大匹配(BFS增广))

    题目链接: http://poj.org/problem?id=3041 Description Bessie wants to navigate her spaceship through a da ...

  5. hdu 4568(SPFA预处理+TSP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP ...

  6. hdu 2444 交叉染色判断二分图+二分最大匹配

    /*1A 31ms*/ #include<stdio.h> #include<string.h> #define N 300 int n; struct node { int ...

  7. [codeforces 852 D] Exploration Plan 解题报告 (二分+最大匹配)

    题目链接:http://codeforces.com/problemset/problem/852/D 题目大意: 有V个点,N个队伍,E条边,经过每条边有个时间,告诉你初始N个队伍的位置,求至少有K ...

  8. UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)

    题意: 给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值? 思路: 首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少.一般这种就是二分猜平均权值了,因为环在哪也难以找出来 ...

  9. poj 3501 Escape from Enemy Territory 预处理+二分+bfs

    传送门 给一个起点一个终点, 给出整个地图的宽和高, 给出n个敌人的坐标. 让你找到一条路径, 这条路径上的点距离所有敌人的距离都最短, 输出最短距离. 首先预处理出来地图上的所有点到敌人的最短距离, ...

随机推荐

  1. MYSQL远程登录权限设置(转)

    Mysql默认关闭远程登录权限,如下操作允许用户在任意地点登录: 1. 进入mysql,GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY ...

  2. Linix常用命令

    uname -a    查看内核版本        ls -al    显示所有文件的属性 pwd         显示当前路径         cd -    返回上一次目录     cd ~    ...

  3. ExtJS学习之路第六步:深入讨论组件Panel用法

    Panel加载页面 var myPanel=Ext.create('Ext.panel.Panel',{ bodyPadding: "15px 10px 0 10px", titl ...

  4. CSS3实现二十多种基本图形

    CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...

  5. [Effective JavaScript 笔记]第24条:使用变量保存arguments对象

    迭代器(iterator)是一个可以顺序存取数据集合的对象.其一个典型的API是next方法.该方法获得序列中的下一个值. 迭代器示例 题目:希望编写一个便利的函数,它可以接收任意数量的参数,并为这些 ...

  6. 将服务器上的myql数据库导入本地数据库

    文章是从我的个人博客上粘贴过来的, 大家也可以访问 www.iwangzheng.com 首先登录到服务器上,进入文件夹,我们这边的是m-cms $mysqldump -uroot mos > ...

  7. 部署细节回忆录(包括了nginx重启)

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) $cap -T $cap deploy:setup $cap deploy           (遇 ...

  8. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...

  9. 【Spring】Spring系列5之Spring支持事务处理

    5.Spring支持事务处理 5.1.事务准备 以上代码结构与AOP的前置通知.返回通知.异常通知.后置通知一样. 5.2.声明式事务 5.2.1.基于注解 5.2.2.基于配置文件 5. 3.事务传 ...

  10. 【SpringMVC】SpringMVC系列12之数据类型转换、格式化、校验

      12.数据类型转换.格式化.校验 12.1.数据绑定流程     Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFacto ...