hdu1533 费用流模板
Going Home
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6114 Accepted Submission(s): 3211
Your task is to compute the minimum amount of money you need to pay in order to send these n little men into those n different houses. The input is a map of the scenario, a '.' means an empty space, an 'H' represents a house on that point, and am 'm' indicates there is a little man on that point.
You can think of each point on the grid map as a quite large square, so it can hold n little men at the same time; also, it is okay if a little man steps on a grid with a house without entering that house.
10
28
/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
int xx=0,ff=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
return xx*ff;
}
const int maxlongint=(1LL<<31)-1;
inline int myabs(int xx)
{if(xx<0)return -xx;return xx;}
inline int mymin(int xx,int yy)
{if(xx>yy)return yy;return xx;}
inline int mymax(int xx,int yy)
{if(xx>yy)return xx;return yy;}
int N,M,st,en;
int s1[110],s2[110],tp1,tp2,ans;
inline int get_id(int xx,int yy)
{return (xx-1)*M+yy;}
inline int get_dis(int id1,int id2){
int sx=id1/M,sy=id1%M,fx=id2/M,fy=id2%M;
if(!sy)
sx--,sy=M;
if(!fy)
fx--,fy=M;
return myabs(sx-fx)+myabs(sy-fy);
}
int lin[210],len;
struct edge{
int y,next,v,f;
}e[200010];
inline void insert(int xx,int yy,int ff,int vv){
e[++len].next=lin[xx];
lin[xx]=len;
e[len].y=yy;
e[len].v=vv;
e[len].f=ff;
}
inline void ins(int xx,int yy,int ff,int vv)
{insert(xx,yy,ff,vv),insert(yy,xx,0,-vv);}
void build(){
st=tp1+tp2+1,en=st+1;
memset(lin,0,sizeof(lin));len=0;
for(int i=1;i<=tp1;i++)
for(int j=1;j<=tp2;j++)
ins(i,j+tp1,1,get_dis(s1[i],s2[j]));
for(int i=1;i<=tp1;i++)
ins(st,i,1,0);
for(int j=1;j<=tp2;j++)
ins(j+tp1,en,1,0);
}
int q[1000010],head,tail,dis[210],Prev[210],useedge[210];
bool vis[210];
bool SPFA(){
memset(vis,0,sizeof(vis));
memset(dis,10,sizeof(dis));
head=tail=0;
q[head]=st;
vis[q[head]]=1;
dis[q[head]]=0;
for(;head<=tail;head++){
vis[q[head]]=0;
for(int i=lin[q[head]];i;i=e[i].next)
if(e[i].f)
if(dis[e[i].y]>dis[q[head]]+e[i].v){
dis[e[i].y]=dis[q[head]]+e[i].v;
if(!vis[e[i].y]){
vis[e[i].y]=1;
q[++tail]=e[i].y;
}
Prev[e[i].y]=q[head];
useedge[e[i].y]=i;
}
}
//printf("#%d#\n",dis[en]);
return dis[en]!=dis[0];
}
void agu(){
int add=maxlongint;
for(int i=en;i!=st;i=Prev[i]){
add=mymin(add,e[useedge[i]].f);
}
for(int i=en;i!=st;i=Prev[i]){
e[useedge[i]].f-=add;
if(useedge[i]&1)
e[useedge[i]+1].f+=add;
else
e[useedge[i]-1].f+=add;
ans+=add*e[useedge[i]].v;
}
}
void cost_flow(){
ans=0;
while(SPFA())
agu();
printf("%d\n",ans);
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
while(1){
N=read(),M=read();
if((!N)&&(!M))
break;
tp1=tp2=0;
char tmp;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
tmp=getchar();
while(tmp==10||tmp==32)
tmp=getchar();
if(tmp=='H')
s1[++tp1]=get_id(i,j);
else if(tmp=='m')
s2[++tp2]=get_id(i,j);
}
build();
cost_flow();
}
return 0;
}
hdu1533 费用流模板的更多相关文章
- HDU2686 费用流 模板
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 6611 K Subsequence(Dijkstra优化费用流 模板)题解
题意: 有\(n\)个数\(a_1\cdots a_n\),现要你给出\(k\)个不相交的非降子序列,使得和最大. 思路: 费用流建图,每个点拆点,费用为\(-a[i]\),然后和源点连边,和后面非降 ...
- 费用流模板(带权二分图匹配)——hdu1533
/* 带权二分图匹配 用费用流求,增加源点s 和 汇点t */ #include<bits/stdc++.h> using namespace std; #define maxn 1000 ...
- 初识费用流 模板(spfa+slf优化) 餐巾计划问题
今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...
- 算法复习——费用流模板(poj2135)
题目: Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16898 Accepted: 6543 De ...
- Spfa费用流模板
; ,maxm=; ,fir[maxn],nxt[maxm],to[maxm]; int cap[maxm],val[maxm],dis[maxn],path[maxn]; void add(int ...
- zkw费用流模板
理论:http://www.cnblogs.com/acha/p/6735037.html #include<cstdio> #include<cstring> #includ ...
- 【费用流】【Next Array】费用流模板(spfa版)
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> using ...
- 费用流 ZOJ 3933 Team Formation
题目链接 题意:两个队伍,有一些边相连,问最大组对数以及最多女生数量 分析:费用流模板题,设置两个超级源点和汇点,边的容量为1,费用为男生数量.建边不能重复建边否则会T.zkw费用流在稠密图跑得快,普 ...
随机推荐
- html5——css选择器
复习 div>p: 子代 div+p:div后面相邻的第一个p div~p: div后面所有的兄弟p 属性选择器 标志:[]:区别于id选择器:#,区别于类名选择器:. 特殊符号:^:开头 ...
- Oracle基础理论笔记(一):模式概念
---oracle 10g 1.在oracle数据库中,数据对象是以模式为单位进行组织和管理的.模式是指一系列的逻辑数据结构或对象的集合. 2.模式与用户名相对应,一个模式只能对应一个用户,并且该模式 ...
- python mongodb压力测试脚本
$ pip install pymongo #!/usr/bin/env python #coding=utf-8 #Author: Ca0Gu0 from pymongo import MongoC ...
- 【第8篇】:Python之面向对象
python之--------封装 一.封装: 补充封装: 封装: 体现在两点: 1.数据的封装(将数据封装到对象中) obj = Foo('宝宝',22) 2.封装方法和属性,将一类操作封装到一个类 ...
- 在Python脚本中调用Django环境(方便、右键运行,可用于ORM测试)
随便创建一个py文件即可: import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODUL ...
- 消除input框的默认样式
input, button, select, textarea { outline: none; -webkit-appearance: none; border-radius: 0; } outli ...
- 团体程序设计天梯赛-练习集L1-006. *连续因子
L1-006. 连续因子 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个正整数N的因子中可能存在若干连续的数字.例如630 ...
- 解析特殊格式的xml到map
由于项目特殊,需要解析的xml文档样式特别,所以自己写了一个解析特殊xml的方法 先提供xml样式 <?xml version="1.0" encoding="UT ...
- OpenStack命令行工具与API
Openstack命令行工具 我们推荐Openstack命令行工具和Openstack的Dashboard两者结合使用.一些用户由于使用过其他云技术背景的,可能会使用EC2兼容的API,相对于我们需要 ...
- Vue2构建项目实战
转载整理自http://blog.csdn.net/fungleo/article/details/77575077 vue构建单页应用原理 SPA 不是指水疗.是 single page web a ...