题目描述

火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车。登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动。探测车在移动中还必须采集岩石标本。每一块岩石标本由最先遇到它的探测车完成采集。每块岩石标本只能被采集一次。岩石标本被采集后,其他探测车可以从原来岩石标本所在处通过。探测车不能通过有障碍的地面。本题限定探测车只能从登陆处沿着向南或向东的方向朝传送器移动,而且多个探测车可以在同一时间占据同一位置。如果某个探测车在到达传送器以前不能继续前进,则该车所采集的岩石标本将全部损失。

用一个 P·Q 网格表示登陆舱与传送器之间的位置。登陆舱的位置在(X1,Y1)处,传送器

的位置在(XP ,YQ)处。

X 1,Y 1 X 2 , Y 1 X 3 , Y 1 ... X P-1, Y 1 X P , Y 1

X 1,Y 2 X 2 , Y 2 X 3 , Y 2 ... X P-1, Y 2 X P , Y 2

X 1, Y 3 X 2 , Y 3 X 3 ,Y 3 ... X P-1, Y 3 X P , Y 3

... ...

X 1 ,Y Q-1 X 2 , Y Q-1 X 3 , Y Q-1 ... X P-1, Y Q-1 X P , Y Q-1

X 1,Y Q X 2 , Y Q X 3 , Y Q ... X P-1, Y Q X P ,Y Q

给定每个位置的状态,计算探测车的最优移动方案,使到达传送器的探测车的数量最多,

而且探测车采集到的岩石标本的数量最多

输入输出格式

输入格式:

第 1行为探测车数,第 2 行为 P 的值,第3 行为Q 的值。接下来的 Q 行是表示登陆舱与传送器之间的位置状态的 P·Q 网格。用 3 个数字表示火星表面位置的状态:0 表示平坦无障碍,1表示障碍,2 表示石块。

输出格式:

每行包含探测车号和一个移动方向,0 表示向南移动,1 表示向东移动。

解题思路:

拆点套路。

代码:

 #include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const int oo=0x3f3f3f3f;
struct pnt{
int hd;
int lst;
int pre;
int dis;
int val;
bool vis;
}p[];
struct ent{
int twd;
int lst;
int vls;
int dis;
int his;
}e[];
struct int_2{
int i,j;
}pi[];
int cnt;
int n,m;
int s,t;
int num;
int mp[][];
int no[][][];
std::queue<int>Q;
void ade(int f,int t,int v,int d)
{
cnt++;
e[cnt].his=v;
e[cnt].twd=t;
e[cnt].vls=v;
e[cnt].dis=d;
e[cnt].lst=p[f].hd;
p[f].hd=cnt;
return ;
}
bool Spfa(void)
{
while(!Q.empty())
Q.pop();
for(int i=;i<=t;i++)
{
p[i].dis=p[i].val=oo;
p[i].vis=false;
}
p[t].pre=-;
p[s].vis=true;
p[s].dis=;
Q.push(s);
while(!Q.empty())
{
int x=Q.front();
Q.pop();
p[x].vis=false;
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].dis>p[x].dis+e[i].dis&&e[i].vls>)
{
p[to].dis=p[x].dis+e[i].dis;
p[to].val=std::min(p[x].val,e[i].vls);
p[to].pre=x;
p[to].lst=i;
if(p[to].vis)
continue;
p[to].vis=true;
Q.push(to);
}
}
}
return p[t].pre!=-;
}
int Ek(void)
{
int ans=;
while(Spfa())
{
ans+=p[t].val;
for(int i=t;i!=s;i=p[i].pre)
{
e[p[i].lst].vls-=p[t].val;
e[((p[i].lst-)^)+].vls+=p[t].val;
}
}
return ans;
}
void Dfs(int ii,int jj,int Ntt)
{
int w=no[ii][jj][];
int x=no[ii][jj][];
int y=no[ii][jj+][];
int z=no[ii+][jj][];
for(int i=p[w].hd;i;i=e[i].lst)
{
if(e[i].vls>=e[i].his)
continue;
e[i].vls++;
int to=e[i].twd;
if(to==y)
{
printf("%d %d\n",Ntt,);
Dfs(ii,jj+,Ntt);
return ;
}else if(to==z)
{
printf("%d %d\n",Ntt,);
Dfs(ii+,jj,Ntt);
return ;
}
}
return ;
}
int main()
{
// freopen("a.in","r",stdin);
scanf("%d%d%d",&num,&m,&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
no[i][j][]=++cnt;
pi[cnt]=(int_2){i,j};
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
no[i][j][]=++cnt;
pi[cnt]=(int_2){i,j};
}
}
s=cnt+;
t=cnt+;
cnt=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==)
continue;
if(mp[i][j]==)
{
ade(no[i][j][],no[i][j][],,-);
ade(no[i][j][],no[i][j][],,);
}
ade(no[i][j][],no[i][j][],oo,);
ade(no[i][j][],no[i][j][],,);
}
} for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(mp[i][j]==)
continue;
if(i+<=n&&mp[i+][j]!=)
{
ade(no[i][j][],no[i+][j][],oo,);
ade(no[i+][j][],no[i][j][],,);
}
if(j+<=m&&mp[i][j+]!=)
{
ade(no[i][j][],no[i][j+][],oo,);
ade(no[i][j+][],no[i][j][],,);
}
}
}
ade(s,no[][][],num,);
ade(no[][][],s,,);
ade(no[n][m][],t,num,);
ade(t,no[n][m][],,);
num=Ek();
for(int i=;i<=num;i++)
Dfs(,,i);
return ;
}

LuoguP3356 火星探险问题(费用流)的更多相关文章

  1. 洛谷P3356 火星探险问题(费用流)

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

  2. 洛谷P3356 火星探险问题(费用流)

    传送门 和深海机器人问题差不多……看到有的大佬是用dp过的,强无敌…… 考虑一下,把每一个点拆点,分别是$A_i$和$B_i$,连一条容量为$inf$,费用为$0$的边,表示可以随便走.如果有石头,再 ...

  3. 【LOJ6225&网络流24题】火星探险问题(费用流)

    题意: 思路: [问题分析] 最大费用最大流问题. [建模方法] 把网格中每个位置拆分成网络中两个节点<i.a>,<i.b>,建立附加源S汇T. 1.对于每个顶点i,j为i东边 ...

  4. BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流

    题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...

  5. 【刷题】LOJ 6225 「网络流 24 题」火星探险问题

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

  6. 【bzoj3291】Alice与能源计划 模拟费用流+二分图最大匹配

    题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...

  7. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  8. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  9. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

随机推荐

  1. [HAOI2016]找相同字符 广义后缀自动机_统计出现次数

    题目描述:给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式输入格式:两行,两个字符串 s1,s2,长度分别为n ...

  2. 高手过愚人节 Manancher模板题_双倍经验

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...

  3. NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)

    个人总结: 这篇文章讲解了express框架中如何使用session,主要用了express-session这个包.更多可以参考npm.js来看,读完这篇文章需要10分钟. 摘选自网络: 文档概览 本 ...

  4. bzoj1618 购买干草

    Description 约翰的干草库存已经告罄,他打算为奶牛们采购日(1≤日≤50000)磅干草.他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi ...

  5. 20180929 北京大学 人工智能实践:Tensorflow笔记05

    (完)

  6. 紫书 例题 10-17 UVa 1639(数学期望+对数保存精度)

    设置最后打开的是盒子1, 另外一个盒子剩下i个 那么在这之前打开了n + n - i次盒子 那么这个时候的概率是C(2 * n - i, n) p ^ (n+1) (1-p)^ (n - i) 那么反 ...

  7. unity gitignore

    /[Ll]ibrary/ /[Tt]emp/ /[Oo]bj/ /[Bb]uild/ /[Bb]uilds/ /Assets/AssetStoreTools* # Autogenerated VS/M ...

  8. 11 hbase源码系列(十一)Put、Delete在服务端是如何处理

    hbase源码系列(十一)Put.Delete在服务端是如何处理?    在讲完之后HFile和HLog之后,今天我想分享是Put在Region Server经历些了什么?相信前面看了<HTab ...

  9. Fragment的实际开发中总结(二)

    在实际项目的开发过程Fragment的情况越来越多.大家肯定须要遇到过Fragment被销毁重建的情况. 结合自己在项目开发的一点总结和学习开源项目的代码.继续分享自己对Fragment的一点总结. ...

  10. UVA 10515 - Powers Et Al.(数论)

    UVA 10515 - Powers Et Al. 题目链接 题意:求出m^n最后一位数 思路:因为m和n都非常大,直接算肯定是不行的,非常easy想到取最后一位来算,然后又非常easy想到最后一位不 ...