zoukankan      html  css  js  c++  java
  • poj 2516Minimum Cost

    http://poj.org/problem?id=2516

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<queue>
      5 #define maxn 110
      6 using namespace std;
      7 
      8 int need[maxn][maxn];
      9 int sup[maxn][maxn];
     10 int cost[maxn][maxn][maxn];
     11 int cap[maxn][maxn];
     12 int flow[maxn][maxn];
     13 int cost1[maxn][maxn];
     14 int d[maxn];
     15 int p[maxn];
     16 int n,m,k;
     17 const int inf=1<<30;
     18 
     19 int main()
     20 {
     21     while(scanf("%d%d%d",&n,&m,&k)!=EOF){
     22         memset(p,0,sizeof(p));
     23         memset(cost1,0,sizeof(cost1));
     24         memset(need,0,sizeof(need));
     25         if(n==0&&m==0&&k==0) break;
     26         for(int i=1; i<=n; i++){
     27             for(int j=1; j<=k; j++)
     28             {
     29                 scanf("%d",&need[i][j]);
     30             }
     31         }
     32         for(int i=1; i<=m; i++)
     33         {
     34             for(int j=1; j<=k; j++)
     35             {
     36                 scanf("%d",&sup[i][j]);
     37             }
     38         }
     39         for(int c=1; c<=k; c++)
     40         {
     41             for(int i=1; i<=n; i++)
     42             {
     43                 for(int j=1; j<=m; j++)
     44                 {
     45                     scanf("%d",&cost[c][j][i]);
     46                 }
     47             }
     48         }
     49         int s=0,t=n+m+1;
     50         bool flag=true;
     51         int tt=0;
     52         for(int i=1; i<=k; i++)
     53         {
     54             memset(cap,0,sizeof(cap));
     55             for(int j=1; j<=m; j++)
     56                  cap[s][j]=sup[j][i];
     57             for(int j=1; j<=m; j++)
     58             {
     59                 for(int c=1; c<=n; c++)
     60                 {
     61                     cap[j][m+c]=sup[j][i];
     62                 }
     63             }
     64             for(int j=1; j<=m; j++)
     65                cap[j+m][t]=need[j][i];
     66             memset(flow,0,sizeof(flow));
     67             for(int j=1; j<=m; j++)
     68             {
     69                 for(int c=1; c<=n; c++)
     70                 {
     71                     cost1[j][c+m]=cost[i][j][c];
     72                     cost1[c+m][j]=-cost1[j][c+m];
     73                 }
     74             }
     75             queue<int>q;
     76             memset(flow,0,sizeof(flow));
     77             int mm=0;
     78             for(;;)
     79             {
     80                 bool inq[maxn];
     81                 for(int i=0; i<=n+m+1; i++) d[i]=(i==s?0:inf);
     82                 memset(inq,false,sizeof(inq));
     83                 q.push(s);
     84                 while(!q.empty())
     85                 {
     86                     int u=q.front(); q.pop();
     87                     inq[u]=false;
     88                     for(int v=0; v<=n+m+1; v++) if(cap[u][v]>flow[u][v]&&d[v]>d[u]+cost1[u][v])
     89                     {
     90                         d[v]=d[u]+cost1[u][v];
     91                         p[v]=u;
     92                         if(!inq[v])
     93                         {
     94                             inq[v]=true;
     95                             q.push(v);
     96                         }
     97                     }
     98                 }
     99                 if(d[t]==inf) break;
    100                 int a=inf;
    101                 for(int u=t; u!=s; u=p[u])
    102                 {
    103                     if(cap[p[u]][u]-flow[p[u]][u]<a)
    104                     {
    105                         a=cap[p[u]][u]-flow[p[u]][u];
    106                     }
    107                 }
    108                 for(int u=t; u!=s; u=p[u])
    109                 {
    110                     flow[p[u]][u]+=a;
    111                     flow[u][p[u]]-=a;
    112                 }
    113                 mm+=d[t]*a;
    114             }
    115             for(int j=1; j<=n; j++)
    116             {
    117                 if(flow[j+m][t]!=cap[j+m][t])
    118                 {
    119                     flag=false;
    120                     break;
    121                 }
    122             }
    123             if(!flag) break;
    124             if(flag) tt+=mm;
    125         }
    126         if(flag) printf("%d
    ",tt);
    127         else printf("-1
    ");
    128     }
    129     return 0;
    130 }
    View Code
  • 相关阅读:
    HTML常用标签1
    mysql 多对多拆分成 一对多(学生,选修课,成绩)
    JDBC工具包使用
    类反射,用于JDBC
    JDBC基础语句使用
    关于线程等待、线程唤醒方法的引入
    synchronized站点抢票同步例题
    python-装饰器
    jwt, token, session和cookies
    miniapp之登录、授权和支付
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3448134.html
Copyright © 2011-2022 走看看