工作安排(待编辑)
来源:互联网 发布:桌面日历软件 编辑:程序博客网 时间:2024/05/22 15:50
裸的费用流。
源点向每件物品连边,容量为C[i], 费用为0。
每个人向汇点连S[i]+1条边,每条边的容量为T[i][j] - T[i][j-1], 费用为W[i][j]。
物品和员工之间直接按所给的矩阵连容量为无穷大的边。
结果要用long long 。
#include <iostream> #include <queue> #include <string.h> #include <cstdio>#define MAX 2010 #define MAXE 600010using namespace std; int maxData = 0x7fffffff; queue<int> dl;int head[MAX],cost[MAXE],net[MAXE],to[MAXE],cap[MAXE];int cnt=1;int map[300][300];void add(int x,int y,int c,int z){ to[++cnt]=y; cost[cnt]=z; cap[cnt]=c; net[cnt]=head[x]; head[x]=cnt;}int flow[MAX];int pre[MAX];//前驱节点int xb[MAX];//记录下标,便于修改容量int n,m;int mflow=0;//最大流long long mcost=0;//最小费用int dis[MAX];//记录从源点到当前节点的最小的费用值,学过最小路的都懂int f[MAX];//标记是否在队列中int ti[MAX];int BFS(int s,int t){ memset(dis,127,sizeof(dis));//赋初值最大值 memset(f,0,sizeof(f));//赋值为0 int INF=dis[0]; while(!dl.empty()) dl.pop(); for(int i=1;i<=n;i++) pre[i]=-1;//清空前驱节点 f[s]=1; dis[s]=0; pre[s]=0; flow[s]=maxData; dl.push(s); while(!dl.empty()) { int dd=dl.front(); dl.pop(); f[dd]=0; for(int i=head[dd];i;i=net[i]) { int tmp=to[i]; if(cap[i]>0&&dis[tmp]>dis[dd]+cost[i])//松弛操作 { dis[tmp]=dis[dd]+cost[i]; pre[tmp]=dd; xb[tmp]=i; flow[tmp]=min(flow[dd],cap[i]); if(!f[tmp]) f[tmp]=1,dl.push(tmp); } } } if(dis[t]>=INF) return 0;//成功找到了增广路 return 1;}void max_flow(int s,int t){ while(BFS(s,t)) { int k=t; while(k!=s) { cap[xb[k]]-=flow[t]; cap[xb[k]^1]+=flow[t]; k=pre[k]; } mflow+=flow[t]; mcost+=flow[t]*dis[t];//流量乘以最小单位流量的费用即为最小费用 }}int main(){ int s,t; t=MAX-1; scanf("%d%d",&n,&m);//n为人,m为产品 s=0; int b=n+m; for(int i=1;i<=n;i++) add(s,i,maxData,0),add(i,s,0,0); for(int i=1;i<=m;i++) { int c; scanf("%d",&c); add(i+n,t,c,0); add(t,i+n,0,0); } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); for(int i=1;i<=n;i++) { int ss; scanf("%d",&ss); for(int j=1;j<=ss;j++) scanf("%d",&ti[j]); ti[ss+1]=maxData; for(int j=1;j<=ss+1;j++) { int x1; scanf("%d",&x1); add(i,++b,ti[j]-ti[j-1],x1); add(b,i,maxData,-x1); for(int k=1;k<=m;k++) if(map[i][k]) add(b,k+n,maxData,0),add(k+n,b,0,0); } } max_flow(s,t); printf("%lld",mcost); return 0;}
1 0
- 工作安排(待编辑)
- 日历一(待编辑)
- 工作安排
- 工作安排
- 工作安排
- 工作安排
- 工作安排
- 第十八天(待编辑状态)
- [学习笔记]---决策树算法(待编辑)
- CSDN 博客图片编辑(待更新)
- Target近期工作安排(翟超)
- [BZOJ2245][SDOI2011]工作安排(费用流)
- 工作安排(Work scheduling,2009 Open)
- 工作安排(dfs深度优先搜索)
- bzoj2245 [SDOI2011]工作安排(费用流)
- (待处理)aapt.exe停止工作
- 待编辑……
- 待编辑……
- JAVA集合框架——图
- pg_buffercache
- mybatis的优缺点
- TensorFlow入门很好的教程:你好,TensorFlow!
- CentOS7下搭建redis集群
- 工作安排(待编辑)
- 关于胶合逻辑
- 图片的展示清晰度问题研究
- ContentProvider跨程序数据共享
- Ubuntu搜狗输入法无法输入中文等问题
- 内容分发网络cdn在热更重的作用
- 暴力求解数独
- windows下spark2.1源码编译及修改
- 解决有道for mac 无法屏幕取词