zoukankan      html  css  js  c++  java
  • 网络流24题之深海机器人问题

    源点向起点连边,终点向汇点连边。

    点点之间连边,一条是流量无限不花钱的,一条是流量为1花钱的

    最大费用最大流即可。

    By:大奕哥

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=25005,inf=1e9;
     4 int d[N],head[N],cnt=-1,a,b,P,Q,num,p[105][105],cost,f[N],s,t;
     5 bool v[N];
     6 struct node{
     7     int w,to,nex,c,f;
     8 }e[1000005];
     9 void add(int x,int y,int w,int c)
    10 {
    11     e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].f=x;e[cnt].w=w;e[cnt].c=c;
    12     e[++cnt].to=x;e[cnt].nex=head[y];head[y]=cnt;e[cnt].f=y;e[cnt].w=0;e[cnt].c=-c;
    13 }
    14 queue<int>q;
    15 bool spfa()
    16 {
    17     memset(d,0x3f,sizeof(d));
    18     memset(v,0,sizeof(v));
    19     memset(f,-1,sizeof(f));
    20     v[s]=1;d[s]=0;q.push(s);
    21     while(!q.empty())
    22     {
    23         int x=q.front();q.pop();v[x]=0;
    24         for(int i=head[x];i!=-1;i=e[i].nex)
    25         {
    26             if(!e[i].w||d[e[i].to]<=d[x]+e[i].c)continue;
    27             int y=e[i].to;
    28             d[y]=d[x]+e[i].c;f[y]=i;
    29             if(!v[y])
    30             {
    31                 q.push(y);v[y]=1;
    32             }
    33         }
    34     }
    35     if(d[t]>inf)return 0;
    36     int flow=inf;
    37     for(int i=f[t];i!=-1;i=f[e[i].f])
    38     flow=min(flow,e[i].w);
    39     for(int i=f[t];i!=-1;i=f[e[i].f])
    40     e[i].w-=flow,e[i^1].w+=flow,cost+=flow*e[i].c;
    41     return 1;
    42 }
    43 int main()
    44 {
    45     scanf("%d%d",&a,&b);
    46     scanf("%d%d",&P,&Q);
    47     memset(head,-1,sizeof(head));
    48     for(int i=0;i<=P;++i)
    49     for(int j=0;j<=Q;++j)
    50     p[i][j]=++num;
    51     s=0;t=num+1;int x,k,y;
    52     for(int i=0;i<=P;++i)
    53     for(int j=1;j<=Q;++j)
    54     {
    55         scanf("%d",&x);
    56         add(p[i][j-1],p[i][j],1,-x);
    57         add(p[i][j-1],p[i][j],inf,0);
    58     }
    59     for(int j=0;j<=Q;++j)
    60     for(int i=1;i<=P;++i)
    61     {
    62         scanf("%d",&x);
    63         add(p[i-1][j],p[i][j],1,-x);
    64         add(p[i-1][j],p[i][j],inf,0);
    65     }
    66     for(int i=1;i<=a;++i)
    67     {
    68         scanf("%d%d%d",&k,&x,&y);
    69         add(s,p[x][y],k,0);
    70     }
    71     for(int i=1;i<=b;++i)
    72     {
    73         scanf("%d%d%d",&k,&x,&y);
    74         add(p[x][y],t,k,0);
    75     }
    76     while(spfa());
    77     printf("%d
    ",-cost);
    78     return 0;
    79 }
  • 相关阅读:
    路由懒加载的实现
    vue中的tab栏切换内容变换
    H5页面的高度宽度100%
    vue中的路由的跳转的参数
    xxxx-xx-xx的时间的加减
    sql server 2008 R2 备份还原到sql 2012
    eval方法将字符串转换成json对象
    CSS3 圆角(border-radius)
    [Easyui
    JavaScript slice() 方法
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8413324.html
Copyright © 2011-2022 走看看