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\n",ans);
103     return 0;
104 }

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

时间: 2024-10-12 19:15:16

bzoj 2245: [SDOI2011]工作安排的相关文章

bzoj 2245: [SDOI2011]工作安排(费用流)

2245: [SDOI2011]工作安排 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1446  Solved: 692 [Submit][Status][Discuss] Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另

bzoj 2245 [SDOI2011]工作安排【最小费用最大流】

其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i]的边,由所有产品向能制造它的人连容量为inf的边. 因为是最小费用最大流,\( w[i][j]<w[i][j+1] \),所以会自动选择起点小的区间先流. #include<iostream> #include<cstdio> #include<queue> #in

【BZOJ2245】[SDOI2011]工作安排 拆边费用流

[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0

【BZOJ 2245】[SDOI2011]工作安排

Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0表示员工i不能制造产品j. 如 果公司分配了过多工

【bzoj2245】[SDOI2011]工作安排 费用流

题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0表示员工i不能制造产品j. 如果公司分配了过多工作给一名员工,这

[SDOI2011]工作安排

Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0表示员工i不能制造产品j. 如果公司分配了过多工作

BZOJ2245 [SDOI2011]工作安排 【费用流】

题目 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0表示员工i不能制造产品j. 如果公司分配了过多工作给一名员工,这名员

[bzoj2245][SDOI2011]工作安排(费用流)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2245 分析: 要注意到题目下面说的w是单增的 明显的费用流: 弄个源点S,汇点T S连向每种产品,流量是这种产品所需个数,费用是0 每种产品连向能制作它的人,流量为inf,费用是0 每个人向T连Si+1条边,流量t[i][j]-t[i][j-1],费用w[i][j] (因为w是单增的,所以就保证了每个人连向T的Si+1条边肯定是上面的边填满之后再填下面的边,保证了符合题意,如果没有这

P2488 [SDOI2011]工作安排 费用流

\(\color{#0066ff}{ 题目描述 }\) 你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小.由于我们并不想使用Special Judge,也为了使选手有更多的时间研究其他两道题目,你只需要输出最小的愤怒值之和就可以了. \(\color{#0066ff}{输入格式}\) \(\color{#0066ff}{输出格式}\) 仅输出一个整数,表示最小的愤怒值之和. \(\color{#0066ff}{输入样例}\) 2 3 2 2 2 1 1 0 0