洛谷 P3356 火星探险问题 【最大费用最大流】
输出方案好麻烦啊
拆点,石头的连(i,i',1,1)(i,i',inf,0)表示可以取一次价值1,空地直接连(i,i',inf,0),对于能走到的两个格子(不包括障碍),连接(i',j,inf,0),然后连接s和起点,终点和t,流量为探测车的数量。然后跑最大费用最大流。
关于输出方案,dfs即可,每经过一次就把反向边的流量减一即可,注意不要输出i'
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=1000005,inf=1e9;
int q,n,m,a[40][40],bs,h[N],cnt=1,dis[N],fr[N],s,t,ans,sum;
bool v[N];
struct qwe
{
	int ne,no,to,va,c;
}e[N<<2];
int read()
{
	int r=0,f=1;
	char p=getchar();
	while(p>'9'||p<'0')
	{
		if(p=='-')
			f=-1;
		p=getchar();
	}
	while(p>='0'&&p<='9')
	{
		r=r*10+p-48;
		p=getchar();
	}
	return r*f;
}
void add(int u,int v,int w,int c)
{
	cnt++;
	e[cnt].ne=h[u];
	e[cnt].no=u;
	e[cnt].to=v;
	e[cnt].va=w;
	e[cnt].c=c;
	h[u]=cnt;
}
void ins(int u,int v,int w,int c)
{
	add(u,v,w,c);
	add(v,u,0,-c);
}
bool spfa()
{
	queue<int>q;
	for(int i=s;i<=t;i++)
		dis[i]=-inf;
	dis[s]=0;
	v[s]=1;
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		v[u]=0;
		for(int i=h[u];i;i=e[i].ne)
			if(e[i].va>0&&dis[e[i].to]<dis[u]+e[i].c)
			{
				dis[e[i].to]=dis[u]+e[i].c;
				fr[e[i].to]=i;
				if(!v[e[i].to])
				{
					v[e[i].to]=1;
					q.push(e[i].to);
				}
			}
	}
	return dis[t]!=-inf;
}
void mcf()
{
	int x=inf;
	for(int i=fr[t];i;i=fr[e[i].no])
		x=min(x,e[i].va);
	for(int i=fr[t];i;i=fr[e[i].no])
	{
		e[i].va-=x;
		e[i^1].va+=x;
		ans+=e[i].c*x;
	}
	sum+=x;
}
void dfs(int x,int y,int u,int k)
{
	int kx,ky,mv;
	for(int i=h[u];i;i=e[i].ne)
		if(e[i].to!=s&&e[i].to!=t&&e[i].to!=u-bs&&e[i^1].va>0)
		{
			e[i^1].va--;
			if(e[i].to>bs)
			{
				dfs(x,y,e[i].to,k);
				return;
			}
			if(e[i].to==(x-1)*n+y+1)
				kx=x,ky=y+1,mv=1;
			else
				kx=x+1,ky=y,mv=0;
			printf("%d% d\n",k,mv);
			dfs(kx,ky,e[i].to+bs,k);
			return;
		}
}
int main()
{
	q=read(),n=read(),m=read();
	bs=n*m,s=0,t=n*m+bs+1;
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=read();
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]!=1)
			{
				int id=(i-1)*n+j;
				if(a[i][j]==2)
					ins(id,id+bs,1,1);
				ins(id,id+bs,inf,0);
				if(i!=m&&a[i+1][j]!=1)
					ins(id+bs,id+n,inf,0);
				if(j!=n&&a[i][j+1]!=1)
					ins(id+bs,id+1,inf,0);
			}
	if(a[1][1]!=1)
		ins(s,1,q,0);
	if(a[m][n]!=1)
		ins(n*m+bs,t,q,0);
	while(spfa())
		mcf();
	for(int i=1;i<=sum;i++)
		dfs(1,1,1,i);
	return 0;
}
												
											洛谷 P3356 火星探险问题 【最大费用最大流】的更多相关文章
- 洛谷P3356 火星探险问题(费用流)
		
传送门 和深海机器人问题差不多……看到有的大佬是用dp过的,强无敌…… 考虑一下,把每一个点拆点,分别是$A_i$和$B_i$,连一条容量为$inf$,费用为$0$的边,表示可以随便走.如果有石头,再 ...
 - 洛谷P3356 火星探险问题(费用流)
		
题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...
 - 洛谷P3381 - 【模板】最小费用最大流
		
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
 - 洛谷 P2053 [SCOI2007]修车(最小费用最大流)
		
题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...
 - 【Luogu】P3356火星探险问题(费用流)
		
题目链接 网络流一条边都不能多连?没道理呀? 不过单看这题的确是个sb题…… #include<cstdio> #include<algorithm> #include< ...
 - 洛谷 P3381【模板】最小费用最大流
		
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...
 - 洛谷 P3381 【模板】最小费用最大流
		
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...
 - 洛谷P1251 餐巾计划问题(最小费用最大流)
		
题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...
 - 洛谷P4016 负载平衡问题(最小费用最大流)
		
题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...
 
随机推荐
- .htaccess重写、安全防护、文件访问权限
			
今天在<外刊IT评论>上看见了关于.htaccess的使用总结,觉得很不错的,因为wp博客还有其他的php的web服务站点好多都是用.htaccess来管理比如效率以及安全的问题,有必要来 ...
 - [Bzoj1009][HNOI2008]GT考试(KMP)(矩乘优化DP)
			
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4309 Solved: 2640[Submit][Statu ...
 - Java加载配置文件类
			
/** * 对应配置文件类, */ package com.up72.parkSys.ThirdParty; import java.io.IOException;import java.io.In ...
 - Spring Cloud(8):Sleuth和Zipkin的使用
			
场景: 某大型电商网站基于微服务架构,服务模块有几十个. 某天,测试人员报告该网站响应速度过慢.排除了网络问题之后,发现很难进一步去排除故障. 那么:如何对微服务的链路进行监控呢? Sleuth: 一 ...
 - 【转】Wireshark技巧-过滤规则和显示规则
			
原文: http://www.cnblogs.com/icez/p/3973873.html ----------------------------------------------------- ...
 - ExpandableListView的使用以及信息的高亮显示
			
ExpandableListView是ListView控件的延伸,它能够对数据进行分组显示和隐藏,并统计总数量.可进行滚动,对某一内容高亮显示. <1>编写xml布局文件,用于获取Expa ...
 - js 二维码
			
https://larsjung.de/jquery-qrcode/ 源码 <!DOCTYPE html> <html> <head> <title>j ...
 - sublime text 3 乱码
			
sublime text 是一款很好用的文字编辑软件,可谓是程序员必备,但是最近发现在mac端使用的时候,中文乱码, 网上一些解决方案,抄袭严重,没有解决实际问题,所以记录下自己解决问题的过程. 1. ...
 - bean的scope属性
			
1.singleton (默认属性) Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引用返回给调用者,spring IOC继续对这些Bean进行后续的生命管理.Bean ...
 - Trie(前缀树)和ternary trie和binary search tree
			
1 什么是trie trie是一棵多叉树,假如存放的是由26个字母(不区分大小写)构成的字符串的话,那么就是一棵26叉树. trie树是一棵前缀树,因为每个结点只保存字符串中的一个字符,整个字符串保存 ...