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个敌人的坐标. 让你找到一条路径, 这条路径上的点距离所有敌人的距离都最短, 输出最短距离. 首先预处理出来地图上的所有点到敌人的最短距离, ...
随机推荐
- ubuntu系统 用户进入后命令行只有一个“$” 美元符号
在新添加用户后,切换到该用户下面后: 发现命令行前面只有一个$符号,很不方便. 虽然每次输入一个bash可以解决,但是太麻烦. 如何解决呢? sudo vi /etc/passwd 找到该用户 wan ...
- Flume-NG(1.5版本)中SpillableMemoryChannel源码级分析
SpillableMemoryChannel是1.5版本新增的一个channel.这个channel优先将evnet放在内存中,一旦内存达到设定的容量就使用file channel写入磁盘.然后读的时 ...
- 国内常用NTP服务器地址及IP
iptables实现80端口转发到8080端口上 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 ...
- android设置图片自适应控件大小
在XML文件的ImageView属性中加上:android:scaleType="fitXY"
- tornado--之cookie自定义(还有session)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhAAAAHzCAIAAAD+WrNvAAAgAElEQVR4nOy993cTV7/vf/6qu865ob
- [BZOJ]1016 JSOI2008 最小生成树计数
最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...
- mysql如何设置密码
1.用root 进入mysql后mysql>set password =password('你的密码');mysql>flush privileges;2.使用GRANT语句 mysql& ...
- css3 变形(transform)、转换(transition)和动画(animation)
http://www.w3cplus.com/content/css3-transform/ 在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动tr ...
- Html5 History API解析
浏览器前进与回退操作 在传统的浏览器中我们只能通过调用window.history对象的 forward() . back() 或 go(number|url) 方法来进行页面的前进.回退或跳转到某一 ...
- AES 推荐文章
链接如下,写得很好!http://blog.csdn.net/a00553344/article/details/4002507