zoukankan      html  css  js  c++  java
  • bzoj 2245: [SDOI2011]工作安排

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 #define M 10000
      5 #define inf 2139062143
      6 using namespace std;
      7 int cnt=1,n,m,T,d[M],q[2*M],f[M],head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],fr[M];
      8 int mp[100];
      9 long long ans;
     10 void jia1(int a1,int a2,int a3,int a4)
     11 {
     12     cnt++;
     13     next[cnt]=head[a1];
     14     head[a1]=cnt;
     15     fro[cnt]=a1;
     16     u[cnt]=a2;
     17     v[cnt]=a3;
     18     w[cnt]=a4;
     19 }
     20 void jia(int a1,int a2,int a3,int a4)
     21 {
     22     jia1(a1,a2,a3,a4);
     23     jia1(a2,a1,0,-a4);
     24     return;
     25 }
     26 bool spfa()
     27 {
     28     memset(d,127,sizeof(int)*(T+1));
     29     d[0]=0;
     30     f[0]=1;
     31     q[1]=0;
     32     int h=0,t=1;
     33     for(;h<t;)
     34       {
     35         h++;
     36         int p=q[h];
     37         f[p]=0;
     38           for(int i=head[p];i;i=next[i])
     39           if(v[i]&&d[u[i]]>d[p]+w[i])
     40             {
     41                 d[u[i]]=d[p]+w[i];
     42                 fr[u[i]]=i;
     43                 if(!f[u[i]])
     44                   {
     45                     f[u[i]]=1;
     46                     t++;
     47                     q[t]=u[i];
     48                     }
     49             }
     50       }
     51     if(d[T]!=inf)
     52       return 1;
     53     return 0;
     54 }
     55 void mcf()
     56 {
     57     int mx=inf;
     58     for(int i=fr[T];i;i=fr[fro[i]])
     59       mx=min(mx,v[i]);
     60     for(int i=fr[T];i;i=fr[fro[i]])
     61       {
     62         v[i]-=mx;
     63         v[i^1]+=mx;
     64         ans+=mx*w[i];
     65       }
     66     return;
     67 }
     68 int main()
     69 {
     70     scanf("%d%d",&n,&m);
     71     T=n+m+1;
     72     for(int i=1;i<=m;i++)
     73       {
     74         int a1;
     75         scanf("%d",&a1);
     76         jia(n+i,T,a1,0);
     77       }
     78     for(int i=1;i<=n;i++)
     79       for(int j=1;j<=m;j++)
     80         {
     81             int a1;
     82             scanf("%d",&a1);
     83             if(a1)
     84               jia(i,n+j,inf,0);
     85         }
     86     for(int i=1;i<=n;i++)
     87       {
     88         int si;
     89         scanf("%d",&si);
     90         for(int j=1;j<=si;j++)
     91           scanf("%d",&mp[j]);
     92         mp[si+1]=inf;
     93         for(int j=1;j<=si+1;j++)
     94           {
     95             int a1;
     96             scanf("%d",&a1);
     97             jia(0,i,mp[j]-mp[j-1],a1);
     98           }
     99       }
    100     for(;spfa();)
    101       mcf();
    102     printf("%lld
    ",ans);
    103     return 0;
    104 }

    按分段函数拆点跑费用流。

  • 相关阅读:
    ThreadLocal的设计理念与作用
    生产者消费者模式
    Java 线程池
    对象锁(包括方法锁)和类锁
    C++入门经典-例2.12-求逻辑表达式的值
    C++入门经典-例2.11-流输出小数控制
    C++入门经典-例2.10-控制输出精确度
    C++入门经典-例2.9-输出十六进制数以及大写的十六进制数
    C++入门经典-例2.8-输出整数,控制打印格式
    C++入门经典-例2.7-控制cout打印格式程序
  • 原文地址:https://www.cnblogs.com/xydddd/p/5300044.html
Copyright © 2011-2022 走看看