深海机器人问题

费用流Orz
懒癌发作复制了个mcf的模板
然后那个模板建边cost是不取反的,因此出现了负环,spfa出不来了,调试到心态爆炸Orz

建模:每个点向与它有相连的点连一条边权为1,cost为v的边,表示一个物品可取一次,再连一条边权inf,cost为0的边。

读题大赛,出题人语文水平堪忧。

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100010,S=99999,T=100000,inf=0x3f3f3f3f;
int p,q,sum,ecnt=1,head[N],dis[N],from[N],a,b,mincost,maxflow;
bool inq[N];
struct Edge {
    int to,nxt,val,cost,from;
} e[1000010];
int id(int x,int y) {
    return x*(q+1)+y;
}
void add(int bg,int ed,int val,int cost) {
    e[++ecnt].cost=cost;
    e[ecnt].from=bg;
    e[ecnt].nxt=head[bg];
    e[ecnt].to=ed;
    e[ecnt].val=val;
    head[bg]=ecnt;
}
void insert(int bg,int ed,int val,int cost) {
    add(bg,ed,val,cost);
    add(ed,bg,0,-cost);
}
queue<int>qu;
bool spfa() {
    qu.push(S);
    std::memset(dis,0x3f,sizeof dis);
    std::memset(inq,0,sizeof inq);
    dis[S]=0;
    inq[S]=1;
    while(!qu.empty()) {
        int u=qu.front();
        qu.pop();
        inq[u]=0;
        for(int i=head[u],v; i; i=e[i].nxt) {
            v=e[i].to;
            if(dis[v]>dis[u]+e[i].cost&&e[i].val) {
                dis[v]=dis[u]+e[i].cost;
                from[v]=i;
                if(!inq[v]) qu.push(v),inq[v]=1;
            }
        }
    }
    return dis[T]!=inf;
}
void min(int &x,int y) {
    x=x<y?x:y;
}
void mcf() {
    int x=inf,i=from[T];
    while(i) {
        min(x,e[i].val);
        i=from[e[i].from];
    }
    maxflow+=x;
    i=from[T];
    while(i) {
        e[i].val-=x;
        e[i^1].val+=x;
        mincost+=x*e[i].cost;
        i=from[e[i].from];
    }
}
int main() {
    scanf("%d%d%d%d",&a,&b,&p,&q);
    for(int i=1,v; i<=p+1; i++) {
        for(int j=1; j<=q; j++) {
            scanf("%d",&v);
            insert(id(i-1,j-1),id(i-1,j),1,-v);
            insert(id(i-1,j-1),id(i-1,j),inf,0);
        }
    }
    for(int i=1,v; i<=q+1; i++) {
        for(int j=1; j<=p; j++) {
            scanf("%d",&v);
            insert(id(j-1,i-1),id(j,i-1),1,-v);
            insert(id(j-1,i-1),id(j,i-1),inf,0);
        }
    }
    for(int i=1,k,x,y; i<=a; i++) {
        scanf("%d%d%d",&k,&x,&y);
        insert(S,id(x,y),k,0);
    }
    for(int i=1,k,x,y; i<=b; i++) {
        scanf("%d%d%d",&k,&x,&y);
        insert(id(x,y),T,k,0);
    }
    while(spfa())mcf();
    printf("%d",-mincost);
}

原文地址:https://www.cnblogs.com/sdfzhsz/p/9279630.html

时间: 2024-10-11 03:10:03

深海机器人问题的相关文章

深海机器人(cogs 742)

?问题描述:深海资源考察探险队的潜艇将到达深海的海底进行科学考察.潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动.深海机器人在移动中还必须沿途采集海底生物标本.沿途生物标本由最先遇到它的深海机器人完成采集.每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次.本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置.?编程任务:用一个P′Q 网格表示深海机器人的可移动位置.西南角的坐标为(0,0),东北

[网络流24题] 深海机器人

[网络流24题] 深海机器人 时间限制:1 s   内存限制:128 MB 深海机器人问题 «问题描述: 深海资源考察探险队的潜艇将到达深海的海底进行科学考察.潜艇内有多个深海机器 人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动.深海机器人在移动中还 必须沿途采集海底生物标本.沿途生物标本由最先遇到它的深海机器人完成采集.每条预定 路径上的生物标本的价值是已知的,而且生物标本只能被采集一次.本题限定深海机器人只 能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间

洛谷 P4012 深海机器人问题【费用流】

题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 7 2 8 10 9 3 2 0 0 2 2 2 输出样例#1: 42 说明 题解:建图方法如下: 对于矩阵中的每个点,向东.向北分别与其相邻点都要连两条边(重边): 1)容量为1,费用为该边价值的边: 2)容量为INF,费用为0的边(因为多个深海机器人可以在同一时间占据同一位置). 对于每个起点

P4012 深海机器人问题

\(\color{#0066ff}{题目描述}\) 深海资源考察探险队的潜艇将到达深海的海底进行科学考察. 潜艇内有多个深海机器人.潜艇到达深海海底后,深海机器人将离开潜艇向预定目标移动. 深海机器人在移动中还必须沿途采集海底生物标本.沿途生物标本由最先遇到它的深海机器人完成采集. 每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次. 本题限定深海机器人只能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一位置. 用一个 \(P\times Q\) 网

luogu P4012 深海机器人问题

费用流问题,每个样本选一次,就连一条capacity为1,权为给定的值,因为可以重复走,再连capacity为无穷,权为0的边,再一次连接给定的出点和汇点即可 #include<bits/stdc++.h> using namespace std; #define lowbit(x) ((x)&(-x)) typedef long long LL; const int maxm = 3e3+5; const int INF = 0x3f3f3f3f; struct edge{ int

[网络流专练6][线性规划与网络流剩余部分题解]

orz"orzGEOTCBRL" 6:lis 给定正整数序列x1 ,…… , xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长 度为s的递增子序列.  看到题目就666了,前两问不是经典dp?因为序列是上升的,所以如果在x1前面加一个x1,个数显然多了f[x2][xn][s-1],或者xn后面加一个xn, 一样的……然后发现题意理解错T_T “多

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

[SDOI2009][bzoj1877] 晨跑 [费用流]

题面: 传送门 思路: 一个点只能走一回,路径不能相交...... 显然可以转化为网络流的决策来做 我们构建一个网络,令其最大流等于最大的跑步天数即可 怎么构造呢? 对于每个点只能走一次的限制,可以考虑拆点,将每个点(除了起点和终点)拆成两个,中间连一条容量为1的边,就可以了 同时,因为要求走的距离最短,那么给每一条原图中的边赋一个费用,把最大流改成费用流即可 这道题有一个值得深思的地方:是题目中的哪个点让你想到要用网络流而不是别的算法来做的? 这道题我实际上是抱着"网络流那么厉害,说不定就做得

水下通信技术的分类、特征、应用及其最新研究进展

海洋覆盖着地球三分之二的表面积,它是人类探索和研究的最前沿的领域之一.海洋不仅在国际商业和渔业中扮演重要的角色,而且还包含了有关气候的信息,以及大量急待开发的资源. 水下无线通信是研制海洋观测系统的关键技术,借助海洋观测系统,可以采集有关海洋学的数据,监测环境污染,气候变化海底异常地震火山活动,探查海底目标,以及远距离图像传输.水下无线通信在军事中也起到至关重要的作用,而且水下无线通信也是水下传感器网络的关键技术. 水下无线通信主要可以分成三大类:水下电磁波通信.水声通信和水下量子通信,它们具有