/*一开始以为是个贪心 发现自己太naive了将每个技术工人拆成n个点,一共拆n*m个,第i个表示倒数第i次修车。
让每辆车向拆出来的点连边,费用为tmp[i][j]*k,i是技工,j是车,k是拆出来的第几个点,
这样设置费用的原因是j是i倒数第k个修的,那么i修的后k个车都要等倒数第k个车。
然后跑最小费用最大流就可以了
*/#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;inline int read()
{char c=getchar();int num=0;for(;!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())num=num*10+c-'0';return num;
}const int N=65;
const int M=2e5+5;int m,n,S,T;
int tim[N][N];
long long ans;int head[M],num_edge;
struct Edge
{int v,nxt,flow,cost;
}edge[M];inline void add_edge(int u,int v,int flow,int cost)
{edge[++num_edge].v=v;edge[num_edge].flow=flow;edge[num_edge].cost=cost;edge[num_edge].nxt=head[u];head[u]=num_edge;edge[++num_edge].v=u;edge[num_edge].flow=0;edge[num_edge].cost=-cost;edge[num_edge].nxt=head[v];head[v]=num_edge;
}int dis[M];
queue<int> que;
bool inque[M];
bool spfa()
{memset(dis,0x3f,sizeof(dis));que.push(S),dis[S]=0;int now;while(!que.empty()){now=que.front(),que.pop();for(int i=head[now],v;i;i=edge[i].nxt){if(edge[i].flow==0)continue;v=edge[i].v;if(dis[v]>dis[now]+edge[i].cost){dis[v]=dis[now]+edge[i].cost;if(!inque[v]){que.push(v);inque[v]=1;}}}inque[now]=0;}return dis[T]!=0x3f3f3f3f;
}int vis[M],visf;
int dfs(int u,int flow)
{if(u==T||!flow)return flow;int outflow=0;vis[u]=visf;for(int i=head[u],v,tmp;i;i=edge[i].nxt){if(!edge[i].flow)continue;v=edge[i].v;if(vis[v]!=visf&&dis[v]==dis[u]+edge[i].cost){tmp=dfs(v,min(flow,edge[i].flow));if(!tmp)continue;ans+=1ll*tmp*edge[i].cost;edge[i].flow-=tmp;edge[i^1].flow+=tmp;flow-=tmp;outflow+=tmp;if(!flow){vis[u]=0;return outflow;}}}vis[u]=0;dis[u]=0x7fffffff;return outflow;
}int main()
{num_edge=1;m=read(),n=read();T=n+n*m+1;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)tim[j][i]=read();for(int i=1;i<=n;++i)add_edge(S,i,1,0);for(int i=1,p;i<=m;++i){for(int j=1;j<=n;++j){p=i*n+j;add_edge(p,T,1,0);for(int c=1;c<=n;++c)add_edge(c,p,1,tim[i][c]*j);}}while(spfa()){++visf;dfs(S,0x7fffffff);}printf("%.2lf",1.0*ans/n);return 0;
}

转载于:https://www.cnblogs.com/lovewhy/p/9633745.html

1070: [SCOI2007]修车相关推荐

  1. 【BZOJ】1070: [SCOI2007]修车

    1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...

  2. BZOJ 1070: [SCOI2007]修车(最小费用最大流)

    建图很神奇..建完图其实就是裸的费用流了.. -------------------------------------------------------------- #include<cs ...

  3. BZOJ 1070: [SCOI2007]修车

    1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要 ...

  4. [BZOJ 1070][SCOI2007]修车(费用流)

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

  5. BZOJ 1070: [SCOI2007]修车(费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...

  6. bzoj 1070: [SCOI2007]修车【最小费用最大流】

    一开始从客人角度想的,怎么建都不对 从一个修车工所接待的所有顾客花费的总时间来看,设一共有x个人,那么第一个修的对总时间的贡献是x*w1,第二个是(x-1)*w2-以此类推.所以把第i个修车工拆成n组 ...

  7. luogu P2053 [SCOI2007]修车(费用流提前计算)

    P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...

  8. luogu P2053 [SCOI2007]修车

    P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...

  9. bzoj1070: [SCOI2007]修车 网络流

    bzoj1070: [SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的 ...

最新文章

  1. python语言标号_Python 编码为什么那么蛋疼?
  2. python和javascript哪个好_JavaScript与Python:主要区别
  3. 准确率、召回率、F1、mAP、ROC、AUC
  4. 带你读AI论文:基于Transformer的直线段检测
  5. python2.7初学(〇)
  6. @Autowired与@Resource用法
  7. Microsoft Excel设置单元格下拉框的方法
  8. centos下nginx安装和配置
  9. HarmoneyOS鸿蒙系统零代码编程入门
  10. SQLyog安装使用教程
  11. u盘linux启动盘制作ultraiso,U+启动:利用UltraISO制作启动U盘,引导DOS系统
  12. linux tomcat 验证码无法显示
  13. python做一个网页多少钱_网站建设平台_ 网站建设多少钱_ _做一个企业网站需要多少钱_64岁的Python之父表示退休后太无聊 正式加入微软...
  14. teambition/tower/team@osc/worktile团队协作工具价格比较
  15. 不安装Office操作Excel文件(.xlsx)
  16. IOS仿[自选股]项目开发
  17. OneNote 与 OneNote 2016 有什么区别?
  18. 如何高逼格的操作电脑打开软件(文件)Win+R高效启动软件
  19. 我眼中的光明·第三周
  20. 使用 Fiddler 进行 iOS APP 的 HTTP/HTTPS 抓包

热门文章

  1. STM32开发板入门教程(十三) - SPI模式读写SD卡
  2. 如何使用eclipse进行嵌入式Linux的开发
  3. cmake-gui出错解决方法
  4. 脉冲多普勒雷达_是人类还是动物? 多普勒脉冲雷达和神经网络的目标分类
  5. 康美药业财务造假给股民造成的损失,股民该怎么办?
  6. 纽约时代广场广告费才7千元每天,花钱装逼值不值?
  7. react登录页面_React 实现路由拦截
  8. 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!
  9. php array 如何访问,php – 如何访问$array [@key]值
  10. jtextpane设置不能选中_在Bridge cc中不能使用camera raw 的编辑功能,解决方法