zoukankan      html  css  js  c++  java
  • 深海机器人问题

    费用流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);
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    flutter 3des
    flutter踩坑记
    【OS_Windows】彻底关闭windows10自动更新
    使用 httpclient 上传下载文件
    git操作
    jmeter在Windows下请求https的接口
    python xlsxwriter简单使用
    asp.net core webapi 文件下载实现
    使用微信小程序连接到 MQTT 云服务
    MQTT.js 入门教程
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9279630.html
Copyright © 2011-2022 走看看