【BZOJ1070】【codevs2436】修车,费用流
来源:互联网 发布:java人机猜拳源代码 编辑:程序博客网 时间:2024/05/20 04:49
传送门1
传送门2
写在前面:五一已过,五四示威
思路:分层建图,其实可以联想星际转移问题,把m个修车人拆成n*m个点,对于同一个修车人来说,他的第i个点就是说负责了第n-i+1个修车任务(车的编号不一定是n-i+1)
(以下来自Yveh’s blog)
这样从源连到这n*m个点,容量为1费用为0
后面n个点(表示b辆车)连到汇点,容量为1费用为0
n*m个工人与n辆车互相连接,容量为1,费用为cost[第i个工人][第j辆车]*k(k表示这是修的倒数第几辆车)
考虑修任意一辆车,影响的只能是在它后面修的车(和他本身),所以它后面的车每辆都要多花的时间,就是这辆车的维修时间,所以要*k。
注意:n,m的顺序注意啊!小心数组越界
代码:
#include<bits/stdc++.h>#define inf 0x7fffff using namespace std;int m,n,tot=1,s,t,ans;int up[1000],dis[1000],first[1000],a[65][10];bool vis[1000];struct edge{ int u,v,w,next,cost;}e[150000];queue<int>q;void add(int x,int y,int z,int c){e[++tot]=(edge){x,y,z,first[x],c};first[x]=tot;}bool spfa(){ memset(dis,63,sizeof(dis)); q.push(s);dis[s]=0; while (!q.empty()) { int k=q.front();q.pop();vis[k]=0; for (int i=first[k];i;i=e[i].next) if (e[i].w&&dis[e[i].v]>dis[k]+e[i].cost) { up[e[i].v]=i; dis[e[i].v]=dis[k]+e[i].cost; if (!vis[e[i].v]) vis[e[i].v]=1,q.push(e[i].v); } } return dis[t]<inf;}void flow(){ int minn=inf; for (int i=up[t];i;i=up[e[i].u]) minn=min(minn,e[i].w); for(int i=up[t];i;i=up[e[i].u]) ans+=minn*e[i].cost, e[i].w-=minn,e[i^1].w+=minn;} main(){ scanf("%d%d",&m,&n); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",a[i]+j); t=n*m+n+1; for (int i=1;i<=n*m;i++) add(s,i,1,0),add(i,s,0,0); for (int i=1;i<=n;i++) add(i+n*m,t,1,0),add(t,i+n*m,0,0); for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) for (int k=1;k<=n;k++) add((j-1)*m+i,n*m+k,1,j*a[k][i]), add(n*m+k,(j-1)*m+i,0,-j*a[k][i]); while (spfa()) flow(); printf("%.2lf",(double)ans/n); }
0 0
- 【BZOJ1070】【codevs2436】修车,费用流
- bzoj1070: [SCOI2007]修车 费用流
- [BZOJ1070]SCOI2007修车|费用流
- bzoj1070[SCOI2007]修车(费用流)
- 【费用流】[BZOJ1070]/[HYSBZ1070]修车
- bzoj1070: [SCOI2007]修车-费用流
- [费用流] BZOJ1070: [SCOI2007]修车
- bzoj1070 修车 最小费用流
- [bzoj1070][SCOI2007]修车 费用流
- BZOJ1070 / SCOI2007 修车【网络流/费用流】
- [BZOJ1070][SCOI2007]修车(费用流)
- [BZOJ1070][SCOI2007]修车-最小费用流
- 【最小费用最大流】BZOJ1070 [SCOI2007]修车
- bzoj1070 [SCOI2007]修车(费用流)
- BZOJ1070 修车(zkw费用流 or spfa费用流)
- 【费用流Spfa增广】BZOJ1070(SCOI2007)[修车]题解
- bzoj1070: [SCOI2007]修车(最小费用最大流)
- 【bzoj1070】[SCOI2007]修车 网络流
- Axure的学习
- 【HUSTOJ】1024: 满足条件的数
- LeetCode------Number of 1 Bits
- 关于RT故障的解决办法
- 【Codevs】3339 扫描 单调队列
- 【BZOJ1070】【codevs2436】修车,费用流
- Struts 2中访问Servlet API的几种方法小结
- 设计模式(C++) -----单例模式
- Android学习之仿QQ聊天界面的实现
- Problem A: 打印出所有"水仙花数
- 深度学习之(DNN)深度神经网络
- spoj 后缀数组
- ssm架构的实现(包含项目文件)
- KMP算法的学习