loj 1150(spfa预处理+二分+最大匹配)
题目链接: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预处理+二分+最大匹配)的更多相关文章
- loj 1316(spfa预处理+状压dp)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...
- hdu 4568 Hunter(spfa预处理 + 状压dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:首先spfa预处理出每对宝藏之间的最短距离以及宝藏到边界的最短距离,然后dp[state] ...
- hdu2063 匈牙利算法 二分最大匹配模版题
过山车 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %I64d , %I64u Java class na ...
- POJ 3041 Asteroids(模板——二分最大匹配(BFS增广))
题目链接: http://poj.org/problem?id=3041 Description Bessie wants to navigate her spaceship through a da ...
- hdu 4568(SPFA预处理+TSP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP ...
- hdu 2444 交叉染色判断二分图+二分最大匹配
/*1A 31ms*/ #include<stdio.h> #include<string.h> #define N 300 int n; struct node { int ...
- [codeforces 852 D] Exploration Plan 解题报告 (二分+最大匹配)
题目链接:http://codeforces.com/problemset/problem/852/D 题目大意: 有V个点,N个队伍,E条边,经过每条边有个时间,告诉你初始N个队伍的位置,求至少有K ...
- UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)
题意: 给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值? 思路: 首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少.一般这种就是二分猜平均权值了,因为环在哪也难以找出来 ...
- poj 3501 Escape from Enemy Territory 预处理+二分+bfs
传送门 给一个起点一个终点, 给出整个地图的宽和高, 给出n个敌人的坐标. 让你找到一条路径, 这条路径上的点距离所有敌人的距离都最短, 输出最短距离. 首先预处理出来地图上的所有点到敌人的最短距离, ...
随机推荐
- UML(5)——协作图
协作图中表示了角色之间的关系,通过协作图限定协作中的对象或链.协作指的是在一定的语境中一组对象以及实现某些行为的对象间的相互作用. 协 作图是表现对象协作关系的图,表示了协作中作为各种类元角色的对象所 ...
- [工具]Mac平台开发几个网络抓包工具(sniffer)
Cocoa Packet Analyzer http://www.tastycocoabytes.com/cpa/ Cocoa Packet Analyzer is a native Mac OS X ...
- 最长不下降子序列(LIS)
最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i ...
- tyvj1213 嵌套矩形
描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如 ...
- NOIP2012 借教室
描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.面对海量租借教室的信息,我们自然希望编 ...
- Java中的final修饰符
1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...
- 关于 CAS 不能登录的问题
经过排查,是因为 Capistrano 部署中设置了 http_proxy.此时通过 cas.m.xxxx.com 域名去访问 CAS 服务时,就不通了,需要修改为 IP 来访问. 但是公司的 CAS ...
- Access数据库之偏移注入
/*转载请注明出处:珍惜少年时*/ 偏移注入主要是针对知道表,但是不知道字段的. 这里我已经知道了表明是:sys_admin 可以使用: select exists(selct * from sys_ ...
- Coursera台大机器学习课程笔记10 -- Linear Models for Classification
这一节讲线性模型,先将几种线性模型进行了对比,通过转换误差函数来将linear regression 和logistic regression 用于分类. 比较重要的是这种图,它解释了为何可以用Lin ...
- 2015安徽省赛 B.求和
题目描述 对于正整数n,k,我们定义这样一个函数f,它满足如下规律 现在给出n和k,你的任务就是要计算f(n,k)的值. 输入 首先是一个整数T,表示有T组数据 接下来每组数据是n和k(1<=n ...