luogu P2053 [SCOI2007]修车
P2053 [SCOI2007]修车
题目描述
同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。
说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
输入输出格式
输入格式:
第一行有两个数M,N,表示技术人员数与顾客数。
接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人员维修第i辆车需要用的时间T。
输出格式:
最小平均等待时间,答案精确到小数点后2位。
输入输出样例
2 2 3 2 1 4
1.50
说明
(2<=M<=9,1<=N<=60), (1<=T<=1000)
这是网络流?
这是网络流???
这不是那种随便贪一贪就能出来的题吗?
以上是看题解前的全部想法
一道思路很神奇的最小费用流
设第i辆车交给第j个人修的耗时是a[i][j]
把每个工人拆成n个点,分别代表他修的倒数第1~n辆车(每个人最多修n辆车嘛)
于是一共有n*m个工人点
如果第i辆车是第j个工人倒数第k辆修的车的话,那么这个人以及这个工人接下来要修的那些车的主人都要等a[i][j]的时间,总的贡献就是a[i][j]*k
于是从第i辆车到第[j][k]个工人点连一条流量1费用k*a[i][j]的边
最后再建立超级源汇,跑最小费用流就好了
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=1000,M=N*N,inf=1e9+7; int n,m,a[N][N],id[N][N],cnt=1,p[M],tot,s,t; int dis[M]; bool vis[M],in[M]; queue<int>q; struct edge{int to,nex,val,cos;}e[M<<1]; void add(int u,int v,int lim,int cos){e[++cnt]=(edge){v,p[u],lim,cos};p[u]=cnt;e[++cnt]=(edge){u,p[v],0,-cos};p[v]=cnt; } bool spfa(){for(int i=0;i<M;++i)dis[i]=inf;while(!q.empty())q.pop();memset(in,0,sizeof in);dis[s]=0;q.push(s);while(!q.empty()){int x=q.front();q.pop();in[x]=0;for(int i=p[x];i;i=e[i].nex){int v=e[i].to;if(e[i].val&&dis[v]>dis[x]+e[i].cos){dis[v]=dis[x]+e[i].cos;if(!in[v]){q.push(v);in[v]=1;}}}}return dis[t]<inf; } int dfs(int x,int li){vis[x]=1;if(x==t)return li;int use=li;for(int i=p[x];i;i=e[i].nex){int v=e[i].to;if(!vis[v]&&e[i].val&&use&&dis[v]==dis[x]+e[i].cos){int re=dfs(v,min(use,e[i].val));use-=re;e[i].val-=re;e[i^1].val+=re;}}return li-use; } int dinic(){int ans=0;while(spfa()){memset(vis,0,sizeof(vis));ans+=dfs(s,inf)*dis[t]; // cout<<ans<<endl; } return ans; } int main(){scanf("%d%d",&m,&n);//技术人员数和顾客数tot=n;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){scanf("%d",&a[i][j]);//第i辆车第m个人修耗时 id[j][i]=++tot;}t=++tot;for(int i=1;i<=n;++i)//第i辆车 for(int j=1;j<=m;++j)//第m个人 for(int k=1;k<=n;++k)//倒数第k个修 add(i,id[j][k],1,k*a[i][j]);for(int i=1;i<=n;++i)add(s,i,1,0);for(int j=1;j<=m;++j)for(int k=1;k<=n;++k){add(id[j][k],t,1,0);}double ave=dinic();ave/=n;printf("%.2f",ave);return 0; }
car
by:wypx
fuck,我去你个垃圾题目,毁我青春。害的我作业没写完
不就是一个最小费用流,吧一个人变成m个,在把m个分别连上汇点.每一个车连人拆出来的m个点,费用分别是k*t。
t是花费时间。
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> #include<vector> #include<queue> #define ll long long using namespace std; const int INT=1e7; const int maxn=4000; inline int read(){int an=0;char ch=getchar();while('9'<ch||ch<'0'){ch=getchar();}while(ch<='9'&&'0'<=ch){an=an*10+(ch^48);ch=getchar();}return an; } double ANS; int f[40000],id[100][100],cnt=1,S,T,cntt,n,m; int map[100][100],car_id[100]; struct saber{ int nex,to,wi,lim; }b[maxn*maxn]; inline void add2(int x,int y,int z,int wi){cnt++;b[cnt].nex=f[x];b[cnt].to=y;b[cnt].wi=wi;b[cnt].lim=z;f[x]=cnt; } inline void add(int x,int y,int z,int wi){add2(x,y,z,wi);add2(y,x,0,-wi); } inline void prepare(){m=read();n=read();//m个mmp的工人,闲着没事儿去~~修~~ (开)n个车for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cntt++,id[i][j]=cntt;for(int j=1;j<=n;j++)cntt++,car_id[j]=cntt;cntt++;S=cntt;cntt++;T=cntt;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)map[i] [j]=read();//前是车号,后是人修 for(int i=1;i<=n;i++)//n车 for(int j=1;j<=m;j++)for(int k=1;k<=n;k++)add( car_id[i] , id[k][j] ,1, k*map [i] [j] );for(int i=1;i<=n;i++)add(S,car_id[i],1,0);for(int i=1;i<=n;i++)//n车 for(int j=1;j<=m;j++)add(id[i][j],T,1,0); } deque<int>q; int dis[maxn]; bool in[maxn],vis[maxn]; inline int bfs(){while(!q.empty())q.pop_back();for(int i=0;i<=cntt+233;i++)dis[i]=INT;dis[S]=0;q.push_back(S);memset(in,0,sizeof in);while(!q.empty()){int x=q.front();q.pop_front();in[x]=0;for(int i=f[x];i;i=b[i].nex){int v=b[i].to;if(dis[v]>dis[x]+b[i].wi&&b[i].lim){dis[v]=dis[x]+b[i].wi;if(!in[v]){in[v]=1;if(!q.empty()&&dis[q.front()]>dis[v])q.push_front(v);else q.push_back(v);}}}}return dis[T]!=INT; } inline int dfs(int x,int li){int used=li;vis[x]=1;if(x==T||!li)return li;for(int i=f[x];i&&used;i=b[i].nex){int v=b[i].to;if(vis[v])continue;if(dis[v]==dis[x]+b[i].wi&&b[i].lim){int re=dfs(v,min(used,b[i].lim));used-=re;b[i^1].lim+=re;b[i].lim-=re;}}return li-used; } inline void dinic(){int ans=0;while(bfs()){memset(vis,0,sizeof vis);ans+=dis[T]*dfs(S,INT);}ANS=(double)ans/(double)n;printf("%0.2f",ANS); } int main(){prepare();dinic();return 0; }
修车
by:s_a_b_e_r
转载于:https://www.cnblogs.com/ck666/p/8018203.html
luogu P2053 [SCOI2007]修车相关推荐
- luogu P2053 [SCOI2007]修车(费用流提前计算)
P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...
- P2053 SCOI2007 修车,费用流好题
修车 题目链接 https://www.luogu.org/problemnew/show/P2053 题解 每个人每次只能修一辆车,且这个人修的最后一辆车所花时间为111倍的修这辆车的时间,修倒数第 ...
- 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa
题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...
- [SCOI2007]修车【最大流最小费用】
P2053 [SCOI2007]修车 这道题的思路当真是很不错了,首先,N和M都不是很大.(这是废话了) 然后,看到等修车的时间是一个和的形式,因为从某一时刻进去大家都在等,然后修了的第一批的人的消耗 ...
- 【BZOJ】1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...
- BZOJ 1070: [SCOI2007]修车(最小费用最大流)
建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cs ...
- BZOJ 1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要 ...
- bzoj1070: [SCOI2007]修车 网络流
bzoj1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的 ...
- [SCOI2007]修车,洛谷P2053,最小费用最大流
正题 给出m个师傅,n台车,并给出每个师傅各个车的时间,现在要使得,n辆车一起来,等待时间最短. 我们来观察一个师傅所消耗的等待时间.m个师傅所消耗的总等待时间就是车主的总等待时间. 对于第a个师傅, ...
最新文章
- java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #4)
- raid 物理盘缓存状态_使用MegaCli工具查看Raid磁盘阵列状态
- 使用 加载 顺序_SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
- CDN和CDN加速原理
- Filecoin Gas基础费率跌至4.40 nanoFIL
- 用GibbsLDA做Topic Modeling
- git获取特定的commit
- python三次方函数_python函数基础------第三次作业讲解(二)
- nodejs 做后台的一个完整业务整理
- 易语言精益模块json_精易模块|精易模块下载 v3.46 官方免费版_最火软件站
- MLA 格式引用怎么做好分析?
- CSS3相比CSS新增哪些功能
- 来电时不会发送本地通知
- AndroidQ文件存储适配
- esp8266基本使用 - WebServer
- 前端开发Vue项目实战:电商后台管理系统(八)------ 订单管理模块
- hibernate之HQL实体更新与删除
- ImageMagick将多张图片拼接成一张图片_如何将多张图片排列在一张图片呢?学会这两种技巧,轻松搞定...
- Kubernetes调度器源码学习(三):Preempt抢占机制、调度失败与重试处理
- 由置灰引出的css滤镜filter是什么东西?
热门文章
- 周记计算机岗位任务及完成情况,计算机实习周记
- Nginx+Flv:外网播放内网视频流 解决方案
- 计算机维修进度安排表,教学进度表实验安排表考勤成绩册计算机网络技术教学进度表(计09本).doc...
- Android Sensor分析
- Visual Basic编程语言简介
- MSYS的下载与安装
- 《庄子·内篇·大宗师第六》
- 半导体器件基础08:MOS管结构和原理(2)
- Python爬虫:url中带字典列表参数的编码转换
- Localization 本地化与多语言支持