【Luogu】P3356火星探险问题(费用流)
网络流一条边都不能多连?没道理呀?
不过单看这题的确是个sb题……
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<queue>
#define maxn 100
#define maxm 100000
#define lim n*m
#define F(i,j) ((i-1)*m+j)
#define T(i,j) (F(i,j)+lim)
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int from,next,to,val,dis,flow;
}edge[maxm];
int head[maxn*maxn],num;
inline void addedge(int from,int to,int val,int dis){
edge[++num]=(Edge){from,head[from],to,val,dis,};
head[from]=num;
}
inline void add(int from,int to,int val,int dis){
addedge(from,to,val,dis);
addedge(to,from,,-dis);
} inline int count(int i){ return i&?i+:i-; } int dis[maxn*maxn];
int flow[maxn*maxn];
int pre[maxn*maxn];
bool vis[maxn*maxn];
int Start,End;
int n,m; int spfa(){
memset(dis,-/,sizeof(dis)); dis[Start]=; flow[Start]=0x7fffffff;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front(); q.pop(); vis[from]=;
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val<=edge[i].flow||dis[to]>=dis[from]+edge[i].dis) continue;
dis[to]=dis[from]+edge[i].dis;
pre[to]=i; flow[to]=min(flow[from],edge[i].val-edge[i].flow);
if(vis[to]) continue;
vis[to]=; q.push(to);
}
}
int now=End;
while(now!=Start){
int ret=pre[now];
edge[ret].flow+=flow[End];
edge[count(ret)].flow-=flow[End];
now=edge[ret].from;
}
return dis[End];
} struct Node{
int x,y;
}; Node calc(int ret){
Node ans;
ans.x=(ret-)/m+;
ans.y=ret-(ans.x-)*m;
return ans;
} Node q[maxn*maxn];int tot; void dfs(int x,int y,int now){
if(now==End) return;
for(int i=head[now];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].flow==) continue;
edge[i].flow--; edge[i].val--;
if(to<=lim) q[++tot]=calc(to);
dfs(q[tot].x,q[tot].y,to);
return;
}
} bool ext[maxn][maxn]; int main(){
int e=read();
m=read();n=read();
Start=; End=n*m*;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j){
int x=read();
if(i!=&&ext[i-][j]==) add(T(i-,j),F(i,j),0x7fffffff,);
if(j!=&&ext[i][j-]==) add(T(i,j-),F(i,j),0x7fffffff,);
if(x==){
ext[i][j]=;
continue;
}
add(F(i,j),T(i,j),,x==?:);
add(F(i,j),T(i,j),0x7fffffff,); }
int cnt=;
while(){
int now=spfa();
if(now<) break;
cnt++;
if(cnt>e) break;
tot=;
dfs(,,);
q[]=(Node){,};
for(int j=;j<=tot;++j){
Node a=q[j-],b=q[j];
if(a.x==b.x) printf("%d %d\n",cnt,);
else printf("%d %d\n",cnt,);
}
}
return ;
}
【Luogu】P3356火星探险问题(费用流)的更多相关文章
- 洛谷P3356 火星探险问题(费用流)
题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...
- luogu P3356 火星探险问题
本题很简单的费用流问题,有石头的点需要限制,那我们就可以拆点,capacity为1就可以限制,然后cost为-1,直接跑板子就可以了,注意输出的时候找残量网络的反向边
- LuoguP3356 火星探险问题(费用流)
题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...
- 洛谷P3356 火星探险问题(费用流)
传送门 和深海机器人问题差不多……看到有的大佬是用dp过的,强无敌…… 考虑一下,把每一个点拆点,分别是$A_i$和$B_i$,连一条容量为$inf$,费用为$0$的边,表示可以随便走.如果有石头,再 ...
- 【Luogu】P2053修车(费用流)
题目链接 早上状态不好,虚树搞崩只好来刷网络流了qwq. (然后我犹豫几秒之后看了题解) 使用拆点大法把工人拆成n*m个点,然后每个点代表每个时间段的工人, 然后从车到每个工人点连一条边,权值是耽误的 ...
- 洛谷 P3356 火星探险问题 【最大费用最大流】
输出方案好麻烦啊 拆点,石头的连(i,i',1,1)(i,i',inf,0)表示可以取一次价值1,空地直接连(i,i',inf,0),对于能走到的两个格子(不包括障碍),连接(i',j,inf,0), ...
- P3356 火星探险问题
\(\color{#0066ff}{题目描述}\) 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集 ...
- 【LOJ6225&网络流24题】火星探险问题(费用流)
题意: 思路: [问题分析] 最大费用最大流问题. [建模方法] 把网格中每个位置拆分成网络中两个节点<i.a>,<i.b>,建立附加源S汇T. 1.对于每个顶点i,j为i东边 ...
- luogu P3305 [SDOI2013]费用流
题目链接 bz似乎挂了... luogu P3305 [SDOI2013]费用流 题解 dalao告诉我,这题 似乎很水.... 懂了题目大意就可以随便切了 问1,最大流 问2,二分最大边权求,che ...
随机推荐
- Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] A A Problem about Polyline(数学)
题目中给出的函数具有周期性,总可以移动到第一个周期内,当然,a<b则无解. 假设移动后在上升的那段,则有a-2*x*n=b,注意限制条件x≥b,n是整数,则n≤(a-b)/(2*b).满足条件的 ...
- [dp][uestc]L - 菲波拉契数制升级版
数据很大,以背包的思路数组开不下. 先定序地考虑一个菲波拉契数如fib(i)的表示法,假设i比较大,由菲波拉契数的定义可知道fib(i)=fib(i-1)+fib(i-2);要找到其它表示就继续拆分f ...
- cv2.Canny 边缘检测
Canny边缘检测 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘. 好的定位 - 标识出的边缘要尽可能与实际图像中 ...
- Array - Two Sum
import java.util.HashMap; import java.util.Map; /** * 分析: * 普通实现-嵌套循环两次,时间O(n2),空间O(1) * 复杂实现-循环一次,时 ...
- /^/m|/$/m|\b|\B|$&|$`|$'|变量捕获|()?|(?:pattern)|(?<LABEL>PATTERN)|$+{LABEL}|(|)|\g{LABEL}
#!/usr/bin/perl use strict; use warnings; $_=' $$ oinn &&& ninq kdownc aninp kkkk'; if ( ...
- Ubuntu 下安装WPS
1.先到wps官网上下载wps的deb包. http://www.wps.cn/product/ 2.我使用的64位的,所以得安装32位兼容包 sudo apt-get install ia32-li ...
- 最大长度回文子串(Manacher's algorithm)
输出最大长度的回文子串. string longestPalindrome(string s) { int id, mx, i, j, len, maxlen; vector<char> ...
- 使用jquery.ajax实现省市的二级联动(SSH架构)
首先实现jquery ajax的二级联动 要下载个jquery.js 我在这里就不准备了 自行百度下载 背景介绍:通过部门的ID来查找部门下的所有班级 我实现二级联动的思路是:先查询所有部门 显示在页 ...
- ORACLE的SQL JOIN方式大全
ORACLE的SQL JOIN方式大全 在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结),官方的解释如下所示 A join is a que ...
- Nginx正向代理代理http和https服务
Nginx正向代理代理http和https服务 1. 背景需求 通过Nginx正向代理,去访问外网.可实现局域网不能访问外网的能力,以及防止在上网行为上,留下访问痕迹. 2. 安装配置 2.1安装 w ...