题目链接

  网络流一条边都不能多连?没道理呀?

  不过单看这题的确是个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=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')    f=-1;ch=getchar();}while(isdigit(ch)){num=num*10+ch-'0';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,0};head[from]=num;
}
inline void add(int from,int to,int val,int dis){addedge(from,to,val,dis);addedge(to,from,0,-dis);
}inline int count(int i){    return i&1?i+1:i-1;    }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,-127/3,sizeof(dis));    dis[Start]=0;    flow[Start]=0x7fffffff;queue<int>q;    q.push(Start);while(!q.empty()){int from=q.front();    q.pop();    vis[from]=0;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]=1;    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-1)/m+1;ans.y=ret-(ans.x-1)*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==0)    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=1;    End=n*m*2;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){int x=read();if(i!=1&&ext[i-1][j]==0)    add(T(i-1,j),F(i,j),0x7fffffff,0);if(j!=1&&ext[i][j-1]==0)    add(T(i,j-1),F(i,j),0x7fffffff,0);if(x==1){ext[i][j]=1;continue;}add(F(i,j),T(i,j),1,x==2?1:0);add(F(i,j),T(i,j),0x7fffffff,0);}int cnt=0;while(1){int now=spfa();if(now<0)    break;cnt++;if(cnt>e)    break;tot=0;dfs(1,1,1);q[0]=(Node){1,1};for(int j=1;j<=tot;++j){Node a=q[j-1],b=q[j];if(a.x==b.x)    printf("%d %d\n",cnt,1);else            printf("%d %d\n",cnt,0);}}return 0;
}

转载于:https://www.cnblogs.com/cellular-automaton/p/8449320.html

【Luogu】P3356火星探险问题(费用流)相关推荐

  1. P3356 火星探险问题(网络流)

    P3356 火星探险问题 对于一个第一次经过会有价值,但是之后经过没有价值的点,我们的处理方法就是只连一条流量为1并且有费用的边,再连接流量为INF但是没有费用的边,这样我们要使得价值最大就会优先流有 ...

  2. 洛谷 - P3356 火星探险问题(最大费用最大流+拆点+路径打印)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个数字: 0:平坦无障碍 1:障碍 2:石块 现在在点(1,1)处有k个探测车,他们都要去往点(n,m)处,探测车只能向下或向右行驶,现 ...

  3. luogu P2053 [SCOI2007]修车(费用流提前计算)

    P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...

  4. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)

    题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...

  5. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...

  6. 【费用流】【线性规划】志愿者招募(luogu 3980)

    正题 luogu 3980 题目大意 有n个时刻,第i个时刻需要aia_iai​个志愿者,有m类志愿者,第j类可以从ljl_jlj​做到rjr_jrj​,代价为wjw_jwj​,数量无限,问你使所有时 ...

  7. [P1149] TSOI南湖探险(费用流)

    背景 NOIP2009,TSOI大爆发,创造了历史,书写了传奇.于是,在SRC的提议下,大家一起去南湖公园探险. 描述 南湖地区的地形错综复杂.这里有茂密的原始森林,有一望无际的湖水,有大自然一切钟灵 ...

  8. 网络流二十四题之二十二 —— 火星探险问题

    火星探险问题 Description 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车. 登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动. 探测车在移动中还必须采集岩石标本. ...

  9. P3159 [CQOI2012]交换棋子(费用流)

    题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入输出格式 输入格式:   第 ...

最新文章

  1. HBase学习总结(2):HBase介绍及其基本操作
  2. 解决 iframe 在 ios 上不能滚动的问题
  3. matlab图像显示时间,请问怎么把样点数变成时间显示在图像了里
  4. 从易到难,针对复杂问题的无监督式问题分解方法
  5. C\C++ 获取当前路径
  6. bmp转换tiff c++代码_如何用Java语言将图像转换为PDF?Spire.PDF for Java轻松搞定
  7. 吉林省计算机科学与技术专业测评,我校计算机科学与技术、英语两个专业在吉林省专业综合评价中获得可喜成绩...
  8. 期货一个价格变动对应价值变化
  9. pytorch_pix2pix之argparse
  10. HTML期末作业我的家乡静态网页设计
  11. C语言生成负指数分布,泊松分布与负指数分布的关系
  12. Oracle技巧之 desc+表名
  13. (给3d人物模型添加原始动画文件 针对3d模型有动画文件 没有Avatar 没有Animator Controller)
  14. skimage.filters.frangi函数
  15. 第四章第二节数据资产盘点-数据资产盘点方法伦
  16. 戏说计算机发展史,戏说IT:电脑让你三更死!那你还真死定了(第296期)
  17. 什么是nuget?nuget包是如何管理
  18. python学习dya4
  19. 计算机奖项含金量排名,大家一起拍下NBA常规赛各项奖项含金量排名,都是个人观点,讨论讨论...
  20. linux服务器垃圾清理,Linux下垃圾清理方法总结[转发]

热门文章

  1. python编程语言的缺点-常见的AI编程语言优缺点比较,程序员千万不要入错行!...
  2. python详细安装教程 path-Python解释器安装教程以及环境变量配置
  3. python真的那么强大嘛-python强大吗
  4. python基础一入门必备知识-Python数据分析入门必备基础知识
  5. python个人赚钱攻略-每个懂Python的人都必须知道的赚钱神器
  6. python真的那么强大嘛-这些 Python 库真的很“冷”,但是却很强大
  7. python在当前目录创建txt文件-python根据txt文本批量创建文件夹
  8. 用python画皮卡丘代码-利用Python绘制萌萌哒的皮卡丘
  9. python3.6.0安装教程-Python 3.6.0下载及安装教程
  10. python下载方法-python实现下载文件的三种方法_python