深海机器人问题

匿名 (未验证) 提交于 2019-12-03 00:40:02

费用流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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!