题目链接: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. Java实现Socket5代理服务器

    直接贴代码,不解释 1 主服务,用来侦听端口 package org.javaren.proxy; import java.net.ServerSocket; import java.net.Sock ...

  2. 马化腾:办公用QQ休闲用微信[Dream Catchers论坛]

    近日,香港大学举办以创新创业为主题的Dream Catchers论坛.其中腾讯董事局主席马化腾在下午两点四十五分在李兆基会议中心做了专题演讲,分享了自己的创业经历并回答了媒体人张力奋有关产品.整整对手 ...

  3. 搭建DNS服务器

    导读 Linux下架设DNS服务器通常是使用Bind程序来实现的.Bind是一款实现DNS服务器的开放源码的软件.DNS即域名系统,主要功能是将人们易于记忆的Domain Name(域名)与不易记忆的 ...

  4. characterCustomezition的资源打包代码分析

    using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; class Creat ...

  5. Objective-C和其他C指针的转换

    首先看一下典型的NSString与CFStringRef的相互转换   http://www.tuicool.com/articles/MJRr226 // CFStringRef to NSStri ...

  6. 新鲜出炉的百度js面试题

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 最近两位同学入职百度,带回来的笔试题基本上毫无悬念,不过有一个小题看到让人忍不住笑出声来,真的很无聊 ...

  7. Stanford机器学习---第四讲. 神经网络的表示 Neural Networks representation

    原文 http://blog.csdn.net/abcjennifer/article/details/7749309 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  8. lvs之dr技术的学习与实践

    1.配置测试环境 修改IP windows 200.168.10.4 lvs server  ip:200.168.10.1 因为IP隧道模式只需要一个网卡  所以就停掉其他网卡 web server ...

  9. 极客教学:如何使用树莓派击落&劫持无人机

    本教程的目的是帮助大家理解如何研究未受保护的无线通信的安全风险所在,同时我们希望大家不要对技术进行滥用.我们这里采用的例子是一个流行的无人机模型:Parrot AR.Drone 2.0. 四轴无人机能 ...

  10. [ruby on rails] 跟我学之(1)环境搭建

    环境: ubuntu 12.04 (64bit) 代理: 自己最好弄一个代理. 环境配置指令如下: sudo apt-get update sudo apt-get install curl \cur ...