这周学习了费用流,就写了几题。其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……)。

  题目大意:有m个技术人员n辆车,一个技术人员只能同时修一辆车,每个技术人员修某一辆车都有特定的时间。求最小的等待时间。

  思路分析:这是一道费用流的题目,不看算法基本想不到是费用流。

       那么问题来了:怎么建图!看这个题目就像是把技术人员拆点。按题意建图的话,边权不是确定的,所以考虑拆成倒数第一次,倒数第二次……的n个结点。

       这样边权只要设为(之后的车数+1,也就是倒数的次数)*修车时间,因为包括自己之后每辆车都要等这么多时间。

       然后跑一边费用流。

       注意到它是二分图,所以可以用更高效的算法求解。而我比较蒻,只打了最简单的spfa。

  注意事项:我连wa了6次,是因为我没有认真看题,而样例m=n,n和m读反了就挂了3次(感谢falldream学长帮我debug)!!后面3次是没仔细调完就交还是wa。

  下面附上代码:

  1. #include<cstdio>
  2. using namespace std;
  3. const int inf=;
  4. int n,m,tot=,mx,q[],d[],pree[],h[];
  5. struct edge{int to,nxt,cst,cap;}e[];
  6. bool vis[];
  7. int mn(int x,int y){return x>y?y:x;}
  8. void add(int fr,int to,int cst,int cap)
  9. {
  10. e[++tot]={to,h[fr],cst,cap};h[fr]=tot;
  11. e[++tot]={fr,h[to],-cst,};h[to]=tot;
  12. }
  13. void init()
  14. {
  15. scanf("%d%d",&m,&n);
  16. int a[][];
  17. for(int i=;i<=n;i++)
  18. for(int j=;j<=m;j++)
  19. scanf("%d",&a[j][i]);
  20. for(int j=;j<=n;j++)
  21. {
  22. for(int i=;i<=m;i++)
  23. {
  24. for(int k=;k<=n;k++)
  25. add(j,i*n+k,a[i][j]*k,);//从车向技术人员倒数第k辆连容量1费用k*修车费的边
  26. add(i*n+j,n*m+n+,,);//从技术人员修的每辆车连向汇点容量1费用0的边
  27. }
  28. add(,j,,);//从源点连向每辆车容量1费用0的边
  29. }
  30. mx=n;n=n*m+n+;
  31. }
  32. bool spfa()
  33. {
  34. for(int i=;i<=n;i++)d[i]=inf;
  35. int l=,r=;q[]=;vis[]=;
  36. while(l!=r)
  37. {
  38. int x=q[l=l==n?:l+];
  39. for(int i=h[x];i;i=e[i].nxt)
  40. if(e[i].cap&&e[i].cst+d[x]<d[e[i].to])
  41. {
  42. int v=e[i].to;
  43. pree[v]=i;
  44. d[v]=d[x]+e[i].cst;
  45. if(!vis[v])
  46. {
  47. if(d[v]>d[l+])q[r=r==n?:r+]=v;
  48. else q[l]=v,l=l==?n:l-;
  49. vis[v]=;
  50. }
  51. }
  52. vis[x]=;
  53. }
  54. return d[n]==inf?:;
  55. }
  56. float cf()
  57. {
  58. int cost=,mm=;
  59. while(spfa())
  60. {
  61. int mi=inf;
  62. for(int i=n;i;i=e[pree[i]^].to)
  63. mi=mn(mi,e[pree[i]].cap);
  64. for(int i=n;i;i=e[pree[i]^].to)
  65. {
  66. int ee=pree[i];
  67. e[ee].cap-=mi;
  68. e[ee^].cap+=mi;
  69. }
  70. cost+=d[n]*mi;
  71. mm+=mi;
  72. }
  73. return mm==mx?cost:;
  74. }
  75. int main()
  76. {
  77. init();
  78. printf("%.2f",cf()/mx);
  79. return ;
  80. }

[bzoj1070] 修车的更多相关文章

  1. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  2. bzoj1070 修车&& bzoj2879美食节 【费用流】

    bzoj1070: 把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]. #include ...

  3. [费用流][BZOJ1070]修车

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

  4. [SCOI2007][bzoj1070] 修车 [费用流]

    题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...

  5. BZOJ1070 修车-费用网络流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1070 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技 ...

  6. 【BZOJ1070】[SCOI2007]修车

    [BZOJ1070][SCOI2007]修车 题面 以后要多写题面flag 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 ...

  7. 【BZOJ1070】[SCOI2007]修车 费用流

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

  8. 【BZOJ1070】修车(费用流)

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

  9. [bzoj1070][SCOI2007]修车_费用流

    修车 bzoj-1070 SCOI-2007 题目大意:有m个人要修n台车,每个工人修不同的车的时间不同,问将所有的车都修完,最少需要花费的时间. 注释:$2\le m\le 9$,$1\le n \ ...

随机推荐

  1. tab键、快捷键、默认按钮、小数点输入的使用--四则运算

    1. 窗体Tab键的顺序设置 选中窗体-视图-tab键顺序 label不适用tab键 2. 热键设置和快捷键设置 热键:无论光标在哪都可以 快捷键:出现界面后才能按 添加label 更改label的T ...

  2. matplotlib中什么是后端

    在很多网上文档和邮件列表中提到了"后端",并且很多初学者会对这个术语迷惑.matplotlib把不同使用情形和输出格式作为目标.一些人用matplotlib在python shel ...

  3. Linux特殊字符含义

    文件名以 ' . ' 开头的都是隐藏文件或目录,只需要在文件或目录名前添加 ' . ' 就可以隐藏它 ~               表示主目录 .                当前目录 . .  ...

  4. CentOS7 从查看、启动、停止服务说起systemctl

    执行命令“systemctl status 服务名.service”可查看服务的运行状态,其中服务名后的.service 可以省略,这是CenOS7以后采用systemd作为初始化进程后产生的变化. ...

  5. 获取接口参数名带有“abc”的参数的值

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) va ...

  6. BZOJ3236:[AHOI2013]作业——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3236 第一种做法: 建两棵主席树分别处理两个问题. 第一个问题水,第二个问题参考SPOJ3267/ ...

  7. bzoj1690:[Usaco2007 Dec]奶牛的旅行(分数规划+spfa判负环)

    PS:此题数组名皆引用:戳我 题目大意:有n个点m条有向边的图,边上有花费,点上有收益,点可以多次经过,但是收益不叠加,边也可以多次经过,但是费用叠加.求一个环使得收益和/花费和最大,输出这个比值. ...

  8. 51nod 1172 Partial Sums V2 卡精度的任意模数FFT

    卡精度的任意模数fft模板题……这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.然后我就去网上抄了一下板子……我打的是最土的任意模数f ...

  9. 【BZOJ 4555】[Tjoi2016&Heoi2016]求和 多项式求逆/NTT+第二类斯特林数

    出处0.0用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n ...

  10. [zhuan]VMware中bridge方式网络不能上网的解决办法

    http://jingpin.jikexueyuan.com/article/31601.html 安装好VMware 7后,打开原来的虚拟机文件,发现不能上网,原来的Ethernet是设置的Brid ...