题目描述

你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小。由于我们并不想使用Special Judge,也为了使选手有更多的时间研究其他两道题目,你只需要输出最小的愤怒值之和就可以了。

输入输出格式

输入格式:

输出格式:

仅输出一个整数,表示最小的愤怒值之和。

输入输出样例

输入样例#1:

2 3
2 2 2
1 1 0
0 0 1
1
2
1 10
1
2
1 6

输出样例#1:

24

说明

一看,哇,修车,美食节,直接拆点,跑费用流,光荣T掉,还WA了几个点(原因不明)

然而这个题和修车不一样,每一份流量的性质都是相同的,没有拆点的必要,直接拆边就好了

SS--(C[i],0)-->物品i--(INF,0)-->员工j---(S[j][k]-s[j][k-1],W[i][j])-->TT

把每个员工到TT的边拆成S[i]+1条即可

  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cstdio>
  4 #include <algorithm>
  5 #include <string>
  6 #include <cstring>
  7 #include <cmath>
  8 #include <map>
  9 #include <stack>
 10 #include <set>
 11 #include <vector>
 12 #include <queue>
 13 #include <time.h>
 14 #define eps 1e-7
 15 #define INF 0x3f3f3f3f
 16 #define MOD 1000000007
 17 #define rep0(j,n) for(int j=0;j<n;++j)
 18 #define rep1(j,n) for(int j=1;j<=n;++j)
 19 #define pb push_back
 20 #define set0(n) memset(n,0,sizeof(n))
 21 #define ll long long
 22 #define ull unsigned long long
 23 #define iter(i,v) for(edge *i=head[v];i;i=i->nxt)
 24 #define max(a,b) (a>b?a:b)
 25 #define min(a,b) (a<b?a:b)
 26 #define print_runtime printf("Running time:%.3lfs\n",double(clock())/1000.0)
 27 #define TO(j) printf(#j": %d\n",j);
 28 //#define OJ
 29 using namespace std;
 30 const int MAXINT = 100010;
 31 const int MAXNODE = 700;
 32 const int MAXEDGE = 1000000;
 33 char BUF,*buf;
 34 int read(){
 35     char c=getchar();int f=1,x=0;
 36     while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
 37     while(isdigit(c)){x=x*10+c-'0';c=getchar();}
 38     return f*x;
 39 }
 40 char get_ch(){
 41     char c=getchar();
 42     while(!isalpha(c)) c=getchar();
 43     return c;
 44 }
 45 //------------------- Head Files ----------------------//
 46 int cnt,dis[MAXNODE],q[MAXNODE*MAXNODE],inq[MAXNODE],n,m,C[300],ok[300][300],S[300],T[300][7],W[300][7],SS,TT;
 47 struct edge{
 48     int u,v,c,cost;
 49     edge *nxt;
 50     edge(){}
 51     edge(int _u,int _v,int _c,int _cost,edge *_nxt):u(_u),v(_v),c(_c),cost(_cost),nxt(_nxt){}
 52 }mp[MAXEDGE],*head[MAXNODE],*from[MAXNODE];
 53 void addedge(int u,int v,int c,int cost){
 54     mp[cnt]=edge(u,v,c,cost,head[u]);
 55     head[u]=&mp[cnt++];
 56     mp[cnt]=edge(v,u,0,-cost,head[v]);
 57     head[v]=&mp[cnt++];
 58 }
 59 int spfa(int ss,int tt){
 60     memset(dis,INF,sizeof(dis));
 61     dis[ss]=0;
 62     int *h,*t;
 63     h=t=q;
 64     *t++=ss;
 65     while(h!=t){
 66         int p=*h++;
 67         inq[p]=0;
 68         iter(i,p){
 69             if(i->c&&dis[i->v]>dis[p]+i->cost){
 70                 dis[i->v] = dis[p]+i->cost;
 71                 from[i->v]=i;
 72                 if(!inq[i->v]){
 73                     *t++=i->v;
 74                     inq[i->v]=1;
 75                 }
 76             }
 77         }
 78     }
 79     return dis[tt]!=INF;
 80 }
 81 edge *rev(edge *e){
 82     return &mp[(e-mp)^1];
 83 }
 84 ll extend(int ss,int tt){
 85     ll c=INF,cost=0;
 86     int p=tt;
 87     while(p!=ss){
 88         c=min(c,from[p]->c);
 89         cost+=from[p]->cost;
 90         p=from[p]->u;
 91     }
 92     p=tt;
 93     while(p!=ss){
 94         from[p]->c-=c;
 95         rev(from[p])->c+=c;
 96         p=from[p]->u;
 97     }
 98     return c*cost;
 99 }
100 ll cost_flow(int ss,int tt){
101     ll ans=0;
102     while(spfa(ss,tt)){
103         ans+=extend(ss,tt);
104     }
105     return ans;
106 }
107 void get_input();
108 void work();
109 int main() {
110     get_input();
111     work();
112     return 0;
113 }
114 void work(){
115     SS=698;TT=699;
116     rep0(i,n){
117         addedge(SS,i,C[i],0);
118         rep0(j,m) if(ok[j][i]) addedge(i,n+j,INF,0);
119     }
120     rep0(i,m){
121         if(S[i]==0){
122             addedge(n+i,TT,INF,W[i][0]);
123         }else{
124             addedge(n+i,TT,T[i][0],W[i][0]);
125             for(int j=1;j<S[i];j++){
126                 addedge(n+i,TT,T[i][j]-T[i][j-1],W[i][j]);
127             }
128             addedge(n+i,TT,INF,W[i][S[i]]);
129         }
130     }
131     printf("%lld\n",cost_flow(SS,TT));
132 }
133 void get_input(){
134     m=read();n=read();
135     rep0(i,n) C[i]=read();
136     rep0(i,m) rep0(j,n) ok[i][j]=read();
137     rep0(i,m){
138         S[i]=read();
139         rep0(j,S[i]) T[i][j]=read();
140         rep0(j,S[i]+1) W[i][j]=read();
141     }
142 }
143 /*
144 2 3
145 2 2 2
146 1 1 0
147 0 0 1
148 1
149 2
150 1 10
151 1
152 2
153 1 6
154 */

转载于:https://www.cnblogs.com/LoveYayoi/p/6913912.html

洛谷 P2488 [SDOI2011]工作安排相关推荐

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

    [BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...

  2. bzoj2245 [SDOI2011]工作安排

    (http://www.elijahqi.win/2017/12/11/bzoj2245-sdoi2011%E5%B7%A5%E4%BD%9C%E5%AE%89%E6%8E%92/%20%E2%80% ...

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

    题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...

  4. 洛谷 P2486 [SDOI2011]染色 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 PushDown与Update Q AC代码 总结与拓展 题面 题目链接 P2486 ...

  5. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  6. 洛谷 P2486 [SDOI2011]染色 LCT

    Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #inc ...

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

    其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i ...

  8. bzoj2245 [SDOI2011]工作安排 费用流

    注意这里的分段函数只和个数有关,与种类无关, 然后直接建图,注意开long long 码: #include<iostream> #include<cstdio> #inclu ...

  9. 洛谷P2486 [SDOI2011]染色(树链剖分+线段树判断边界)

    [题目链接] [思路]: 涉及到树上区间修改操作,所以使用树链剖分,涉及到区间查询,所以使用线段树. update操作时,就正常操作,难点在于query操作的计数. 因为树链剖分的dfs序只能保证一条 ...

  10. 洛谷 P2495 [SDOI2011]消耗战

    题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...

最新文章

  1. linux:安装ubuntu18-04
  2. 求连续序列的最大子序列和
  3. Spring Boot 1.5.x新特性:动态修改日志级别
  4. 业绩上不去,老板和业务员都有责任,但首先要划分清楚责任
  5. 反编译apk修改v7包_APK反编译
  6. TensorFlow:偏微分方程
  7. php和gps终端设备通讯,运输车辆GPS定位+语音对讲通讯方案
  8. 正态分布下含绝对值的期望求解 -- 待验证
  9. [Windows 驱动]-Windows 安装好后没有驱动怎么办捏?
  10. 投资的收益与风险的数学建模
  11. 倒计时1天,IMG、完美、腾讯技术大咖相聚直播间详解光线追踪技术
  12. 中国医药流通行业深度分析及十四五发展规划咨询建议报告2022-2028年版
  13. 蒋鑫鸿:9.7国际黄金、纸白银行情走势分析、原油操作建议
  14. 【历史上的今天】2 月 11 日:首款 Ubuntu 手机问世;苹果的天使投资人诞生;电子工业联盟正式停运
  15. 两台电脑用一根网线组建局域网
  16. 输入年份月份实现日历打印,C到C++过渡。
  17. 【Qt学习】04 信号-槽 子窗口向主窗口传递参数
  18. java 电子时钟_java多线程编程制作电子时钟
  19. BZOJ 3709: [PA2014]Bohater 贪心
  20. 互联网战神谷歌大牛Jeff Dean

热门文章

  1. 设备密码的设置以及遗忘重设置
  2. 全选、取消全选、单选
  3. sqlite3在Python2.7下对于中文路径的支持
  4. ES6学习摘要(03)(新人学习)
  5. 设计模式(三): FACTORY工厂模式 -- 创建型模式
  6. [JAVA #183; 初级]:1.环境变量的配置
  7. ubuntu终端颜色配置
  8. 使用DataAnnotations实现数据验证
  9. Flappy Bird 单机版
  10. 7款很棒的 HTML5 视频播放器