zoukankan      html  css  js  c++  java
  • 网络流24题之运输问题

    其实是水题只不过在noip前一个月时我问整个机房也没人能回答上来。

    现在可以随随便便切过去了也是很爽的。

    最小费用最大流,按题目要求建图即可。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=250005,inf=1e9;
     4 int d[N],head[N],cnt=-1,n,m,w[105][105],cost,f[N],a[N],b[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",&m,&n);
    46     s=0;t=n+m+1;memset(head,-1,sizeof(head));
    47     for(int i=1;i<=m;++i)scanf("%d",&a[i]);
    48     for(int i=1;i<=n;++i)scanf("%d",&b[i]);
    49     for(int i=1;i<=m;++i)
    50     {
    51         for(int j=1;j<=n;++j)
    52         {
    53             scanf("%d",&w[i][j]);
    54             add(i,j+m,inf,w[i][j]);
    55         }
    56     }
    57     for(int i=1;i<=m;++i)add(s,i,a[i],0);
    58     for(int i=1;i<=n;++i)add(i+m,t,b[i],0);
    59     while(spfa());
    60     printf("%d
    ",cost);
    61     memset(head,-1,sizeof(head));
    62     cnt=-1;cost=0;
    63     for(int i=1;i<=m;++i)
    64     {
    65         for(int j=1;j<=n;++j)
    66         {
    67             add(i,j+m,inf,-w[i][j]);
    68         }
    69     }
    70     for(int i=1;i<=m;++i)add(s,i,a[i],0);
    71     for(int i=1;i<=n;++i)add(i+m,t,b[i],0);
    72     while(spfa());
    73     printf("%d
    ",-cost);
    74     return 0;
    75 }
  • 相关阅读:
    解释 ASP.NET中的Web页面与其隐藏类之间的关系
    B/S与C/S的联系与区别
    三层架构
    列举 ASP.NET页面之间传递值的几种方式
    什么是SQL注入式攻击?如何防范?
    post、get的区别
    Session,ViewState,Application,cookie的区别?
    Vue 09.前后端交互
    Vue 08.webpack中使用.vue组件
    Vue 07.webpack
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8413333.html
Copyright © 2011-2022 走看看