洛谷 P2488 [SDOI2011]工作安排
题目描述
你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小。由于我们并不想使用Special Judge,也为了使选手有更多的时间研究其他两道题目,你只需要输出最小的愤怒值之和就可以了。
输入输出格式
输入格式:
输出格式:
仅输出一个整数,表示最小的愤怒值之和。
输入输出样例
2 3 2 2 2 1 1 0 0 0 1 1 2 1 10 1 2 1 6
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]工作安排相关推荐
- 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...
- 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% ...
- 【bzoj2245】[SDOI2011]工作安排 费用流
题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...
- 洛谷 P2486 [SDOI2011]染色 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 PushDown与Update Q AC代码 总结与拓展 题面 题目链接 P2486 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树dp)
P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...
- 洛谷 P2486 [SDOI2011]染色 LCT
Code: #include <cstdio> //SDOI2010 染色 #include <algorithm> #include <cstring> #inc ...
- bzoj 2245 [SDOI2011]工作安排【最小费用最大流】
其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i ...
- bzoj2245 [SDOI2011]工作安排 费用流
注意这里的分段函数只和个数有关,与种类无关, 然后直接建图,注意开long long 码: #include<iostream> #include<cstdio> #inclu ...
- 洛谷P2486 [SDOI2011]染色(树链剖分+线段树判断边界)
[题目链接] [思路]: 涉及到树上区间修改操作,所以使用树链剖分,涉及到区间查询,所以使用线段树. update操作时,就正常操作,难点在于query操作的计数. 因为树链剖分的dfs序只能保证一条 ...
- 洛谷 P2495 [SDOI2011]消耗战
题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...
最新文章
- linux:安装ubuntu18-04
- 求连续序列的最大子序列和
- Spring Boot 1.5.x新特性:动态修改日志级别
- 业绩上不去,老板和业务员都有责任,但首先要划分清楚责任
- 反编译apk修改v7包_APK反编译
- TensorFlow:偏微分方程
- php和gps终端设备通讯,运输车辆GPS定位+语音对讲通讯方案
- 正态分布下含绝对值的期望求解 -- 待验证
- [Windows 驱动]-Windows 安装好后没有驱动怎么办捏?
- 投资的收益与风险的数学建模
- 倒计时1天,IMG、完美、腾讯技术大咖相聚直播间详解光线追踪技术
- 中国医药流通行业深度分析及十四五发展规划咨询建议报告2022-2028年版
- 蒋鑫鸿:9.7国际黄金、纸白银行情走势分析、原油操作建议
- 【历史上的今天】2 月 11 日:首款 Ubuntu 手机问世;苹果的天使投资人诞生;电子工业联盟正式停运
- 两台电脑用一根网线组建局域网
- 输入年份月份实现日历打印,C到C++过渡。
- 【Qt学习】04 信号-槽 子窗口向主窗口传递参数
- java 电子时钟_java多线程编程制作电子时钟
- BZOJ 3709: [PA2014]Bohater 贪心
- 互联网战神谷歌大牛Jeff Dean