【BZOJ5070】危险的迷宫

Description

Input

第一行是两个整数A与B(1≤A,B≤10),中间用空格分隔,表示该迷宫是A行B列的。
第2行至第A+1行,每行有B个1至100以内的整数,表示该迷宫每一格的危险程度。
以下一行是一个整数K。接着K行每行有四个整数X0,Y0,X1,Y1,
(1 ≤X0,X1≤A, 1≤Y0,Y1≤B) ,(X0,Y0),(X1,Y1)为相邻的两格,这两格相通。
接着一行是一个整数N(0≤N≤A*B/2),表示有N个出口与入口。
以下N行,每行有两个整数X0,Y0,表示每个入口的行列位置。
以下还有N行,每行有两个整数X1,Y1,表示每个出口的行列位置。

Output

输出仅一个数,若队员们不能全部到达指定目标位置,则输出-1;
否则输出所有队员所经过的所有单元格的危险程度之和。

Sample Input

3 4
20 30 40 30
30 60 20 20
20 15 20 20
13
1 1 2 1
1 2 1 3
1 2 2 2
1 3 1 4
1 4 2 4
2 1 2 2
2 1 3 1
2 2 2 3
2 3 2 4
2 4 3 4
3 1 3 2
3 2 3 3
3 3 3 4
2
1 1
1 2
2 3
3 4

Sample Output

235

题解:直接连边跑最小费用最大流即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define P(X,Y) ((X-1)*B+Y)
#define Q(X,Y) ((X-1)*B+Y+A*B)
using namespace std;
int A,B,n,m,sum,ans,cnt,S,T;
int cost[100000],flow[100000],next[100000],head[100000],to[100000],dis[100000],inq[100000],pv[100000],pe[100000];
queue<int> q;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
inline void add(int a,int b,int c,int d)
{
to[cnt]=b,cost[cnt]=c,flow[cnt]=d,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,cost[cnt]=-c,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
inline int bfs()
{
memset(dis,0x3f,sizeof(dis));
dis[S]=0,q.push(S);
int u,i;
while(!q.empty())
{
u=q.front(),q.pop(),inq[u]=0;
for(i=head[u];i!=-1;i=next[i]) if(dis[to[i]]>dis[u]+cost[i]&&flow[i])
{
dis[to[i]]=dis[u]+cost[i],pe[to[i]]=i,pv[to[i]]=u;
if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
}
}
return dis[T]<0x3f3f3f3f;
}
int main()
{
A=rd(),B=rd(),S=0,T=2*A*B+1;
int i,j,a,b,c,d,mf;
memset(head,-1,sizeof(head));
for(i=1;i<=A;i++) for(j=1;j<=B;j++) add(P(i,j),Q(i,j),rd(),1);
m=rd();
for(i=1;i<=m;i++)
{
a=rd(),b=rd(),c=rd(),d=rd();
add(Q(a,b),P(c,d),0,1),add(Q(c,d),P(a,b),0,1);
}
n=rd();
for(i=1;i<=n;i++) a=rd(),b=rd(),add(S,P(a,b),0,1);
for(i=1;i<=n;i++) a=rd(),b=rd(),add(Q(a,b),T,0,1);
while(bfs())
{
mf=1<<30;
for(i=T;i!=S;i=pv[i]) mf=min(mf,flow[pe[i]]);
sum+=mf,ans+=dis[T]*mf;
for(i=T;i!=S;i=pv[i]) flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;
}
if(sum<n) printf("-1");
else printf("%d",ans);
return 0;
}

【BZOJ5070】危险的迷宫 最小费用最大流的更多相关文章

  1. nyoj 712 探 寻 宝 藏--最小费用最大流

    问题 D: 探 寻 宝 藏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有 ...

  2. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  3. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...

  4. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  5. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  6. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  7. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

  8. hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***

    题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙,          每个逮捕队伍在每个城市可以选 ...

  9. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

随机推荐

  1. Backbone.js 1.0.0源码架构分析(二)——Event

    (function(){ //省略前面代码 var Events = Backbone.Events = { // 根据name订阅事件,push到this._events[name] on: fun ...

  2. font-size<12 chrome不支持解决

    今天,群里有人问道font-size<12 chrome不支持的问题.说实话,这个我一直都没留意过,正好借个机会给自己补习一下. 自己亲自试过,确实如此,当font-size<12 chr ...

  3. mac 安装2个xcode 时会导致找不到xcodebuild

    mac 安装2个xcode 时会导致找不到xcodebuild 解决方案: sudo  xcode-select --switch /Applications/Xcode.app/Contents/D ...

  4. U盘装系统:安装GHOST Win7系统教程

    可以搜索:装机吧 原文地址:http://www.zhuangjiba.com/jiaocheng/show-27-247-1.html

  5. 安卓端OCR文字识别之番外篇

    拍照识别------OCR怎样在移动端大放异彩 大家好.我是文通晓伟.非常高兴能和大家共同探讨一下OCR识别技术在安卓端的应用. 首先坦白交代,我不是技术流,我是销售狗. 每天有打不完的电话和做不完的 ...

  6. InnoDB:文件

    Mysql中有多种类型的文件,每种类型的文件都有其特定的作用,下面就来说说: 参数文件:告诉Mysql实例数据库文件的位置,定义参数. 日志文件:Mysql实例对某种条件作出的响应写入文件,这个文件就 ...

  7. java中的锁池和等待池

    在java中,每个对象都有两个池,锁(monitor)池和等待池 wait() ,notifyAll(),notify() 三个方法都是Object类中的方法. 锁池:假设线程A已经拥有了某个对象(注 ...

  8. jsp中 自定义 tag的几种方式

    在jsp文件中,可以引用tag和tld文件. 1.对于tag文件,使用tagdir引用(这个直接是引用的后缀tag文件的jsp文件) <%@ taglib prefix="ui&quo ...

  9. LINQ----1

    Student[] stAry ={ ), ), ), ), ), ), }; var query1 = from vall in stAry select vall; foreach (Studen ...

  10. js将秒数换算成时分秒

    转载自:http://jingyan.baidu.com/article/375c8e19a0413925f2a229d2.html <script language="javascr ...