【bzoj1070】[SCOI2007]修车 网络流
Description
同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同
的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最
小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
Input
第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人
员维修第i辆车需要用的时间T。
Output
最小平均等待时间,答案精确到小数点后2位。
Sample Input
2 23 21 4
Sample Output
1.50
HINT
数据范围: (2<=M<=9,1<=N<=60), (1<=T<=1000)
Source
其实就是让总等待时间最小。
不好贪心什么的,只能网络流了。
把每个人拆成n个点,表示他修的倒数第i个车,然后就枚举每个车被哪个人第几次修就行了。
第i个车被第j个人倒数第k次修,则贡献是k*a[i][j],因为后面的人要排队等他修完。
其他的很好说,流量为1,费用除了人和车是k*a[i][j]以外其他的都是0
我数组又开小了 自SDOI的MLE之后不敢开太大啊
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;typedef long long LL;
const int SZ = 10010;
const int INF = 1000000010;int head[SZ],nxt[300010],tot = 1;struct edge{int f,t,d,c;
}l[300010];void build(int f,int t,int d,int c)
{l[++ tot] = (edge){f,t,d,c};nxt[tot] = head[f];head[f] = tot;
}void insert(int f,int t,int d,int c)
{build(f,t,d,c); build(t,f,0,-c);
}deque<int> q;
bool use[SZ];
int dist[SZ],pre[SZ];bool spfa(int s,int e)
{memset(dist,63,sizeof(dist));dist[s] = 0;use[s] = 1;q.push_front(s);while(q.size()){int f = q.front(); q.pop_front();use[f] = 0;for(int i = head[f];i;i = nxt[i]){int v = l[i].t;if(l[i].d && dist[v] > dist[f] + l[i].c){dist[v] = dist[f] + l[i].c;pre[v] = i;if(!use[v]){use[v] = 1;if(q.empty() || dist[v] < dist[q.front()])q.push_front(v);elseq.push_back(v);}}}}if(dist[e] > INF) return false;return true;
}int dfs(int s,int e)
{int maxflow = INF;for(int i = pre[e];i;i = pre[l[i].f])maxflow = min(maxflow,l[i].d);int ans = 0;for(int i = pre[e];i;i = pre[l[i].f])ans += maxflow * l[i].c,l[i].d -= maxflow,l[i ^ 1].d += maxflow;return ans;
} int EK(int s,int e)
{int ans = 0;while(spfa(s,e))ans += dfs(s,e);return ans;
}int a[233][233];int main()
{int n,m;scanf("%d%d",&m,&n);for(int i = 1;i <= n;i ++)for(int j = 1;j <= m;j ++)scanf("%d",&a[i][j]);int s = 10000,e = 10001;for(int i = 1;i <= n;i ++)insert(s,i,1,0);for(int i = 1;i <= n;i ++)for(int j = 1;j <= m;j ++)for(int k = 1;k <= n;k ++)insert(i,j * n + k,1,k * a[i][j]);for(int i = 1;i <= m;i ++)for(int j = 1;j <= n;j ++)insert(i * n + j,e,1,0);int ans = EK(s,e);printf("%.2lf\n",(double)ans / n);return 0;
}
【bzoj1070】[SCOI2007]修车 网络流相关推荐
- bzoj1070: [SCOI2007]修车 网络流
bzoj1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的 ...
- bzoj1070: [SCOI2007]修车-费用流
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- bzoj1070: [SCOI2007]修车
本来想写美食节的..但是动态加点不会,今晚有点困,所以就写这题弱化版了. 然后做法就是把一个修理工拆成n个,表示倒数第几个修当前这辆车,这样做的原因就是修一部车的影响是对于后面的车的. 复习一波费用流 ...
- bzoj1070 [SCOI2007]修车 费用流+拆分
这个题一开始容易想到最暴力的建法,由于前面的决策影响后面的人的等待时间,所以就枚举第几个选第几辆, 由于有后面受前面影响,所以也可以看成前面对后面影响,影响的最多n个,所以就枚举影响建图,由于3辆车 ...
- 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa
题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...
- 【BZOJ】1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...
- luogu P2053 [SCOI2007]修车
P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...
- luogu P2053 [SCOI2007]修车(费用流提前计算)
P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...
- BZOJ 1070: [SCOI2007]修车(最小费用最大流)
建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cs ...
最新文章
- python HDF5 h5py 的用法
- 死磕算法第二弹——栈、队列、链表(5)
- Appnium安装-Mac平台
- Linux内核模块自动加载机制 .
- 用户界面草图设计工具-工具包和资源
- Netcore webservice
- 游戏开发之测试篇3(C++)
- 一名 IT 经理是如何把项目带崩的?
- 百度文库文档免费下载功能
- Android flag详解
- 还在为日程安排发愁?是因为你没有使用飞项
- Git 学习(篇六 --储藏与清理)
- 重新开博,短期目标,工作计划
- 矩阵快速幂2Jzzhu and Sequences Recurrences Contemplation! Algebra Reading comprehension
- 2018字节跳动(今日头条那个)一面凉经
- 中忻嘉业:抖音小店怎样来做
- [LLVM教程]LLVM之第一个语言前端
- 自定义组件中添加其他组件-1 83课 左边部分,右边部分的测试
- HTML5期末大作业:餐饮美食网站设计——绿色的餐饮美食网站(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
- android 老年模式 oppo,善用手机“老人模式”,OPPO这几大核心功能很关键