2047. [ZOJ2676]网络战争

★★★   输入文件:networkwar.in   输出文件:networkwar.out   评测插件
时间限制:5 s  
内存限制:32 MB

【题目描述】

Byteland的网络是由n个服务器和m条光纤组成的,每条光纤连接了两个服务器并且可以双向输送信息。这个网络中有两个特殊的服务器,一个连接到了全球的网络,一个连接到了总统府,它们的编号分别是1和N.

最近一家叫做Max Traffic的公司决定控制几条网络中的光纤,以使他们能够掌握总统府的的上网记录。为了到达这个目的,他们需要使所有从1号服务器到N号服务器的数据都经过至少一条他们所掌握的线路。

为了把这个计划付诸于行动,他们需要从这些线路的拥有者手中购买线路,每条线路都有对应的花费。自从公司的主要业务部是间谍活动而是家用宽带以后,经理就希望尽可能少的花费和尽可能高的回报。因此我们要使购买线路的平均值最小。

如果我们购买了k条线路,花费了c元,我们希望找到使c/k最小的方案。

【输入格式】

多组数据,每组数据第一行是两个整数n和m(1<=n<=100,1<=m<=400),代表服务器的个数和线路数

之后的m行,每行三个整数a,b,c,分别代表了这条线路所连接的服务器和购买这条线路的花费,花费都是正数且不会超过10^7

没有自边,没有重边,保证任意两点都是连通的。

最后一行为两个0

【输出格式】

每组数据的第一行是一个整数k,代表购买多少条线路

之后k个整数,代表购买线路的编号,编号是它们在输入文件被给处的顺序

每组数据之间有一个空行

【样例输入】

  1. 6 8
  2. 1 2 3
  3. 1 3 2
  4. 2 4 2
  5. 2 5 2
  6. 3 4 2
  7. 3 5 2
  8. 5 6 3
  9. 4 6 3
  10. 4 5
  11. 1 2 2
  12. 1 3 2
  13. 2 3 1
  14. 2 4 2
  15. 3 4 2
  16. 0 0

【样例输出】

  1. 4
  2. 3 4 5 6
  3.  
  4. 3
  5. 1 2 3
  6.  
  7.   可以看看2007胡博涛的论文。
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <queue>
  5. #include <cmath>
  6. using namespace std;
  7. const int maxn=;
  8. const int maxm=;
  9. const double eps=1e-;
  10. const int INF=;
  11. int n,m,e[maxm][];
  12. int cnt,fir[maxn],to[maxm],nxt[maxm],ID[maxm];
  13. double cap[maxn];
  14. void addedge(int a,int b,double c,int id){
  15. nxt[++cnt]=fir[a];
  16. fir[a]=cnt;
  17. ID[cnt]=id;
  18. cap[cnt]=c;
  19. to[cnt]=b;
  20. }
  21.  
  22. queue<int>q;
  23. int dis[maxn];
  24. bool BFS(int s,int t){
  25. memset(dis,,sizeof(dis));
  26. dis[t]=;q.push(t);
  27. while(!q.empty()){
  28. int x=q.front();q.pop();
  29. for(int i=fir[x];i;i=nxt[i])
  30. if(!dis[to[i]]){
  31. dis[to[i]]=dis[x]+;
  32. q.push(to[i]);
  33. }
  34. }
  35. return dis[s];
  36. }
  37.  
  38. int fron[maxn];
  39. int gap[maxn],path[maxn];
  40. double ISAP(int s,int t){
  41. if(!BFS(s,t))return ;
  42. for(int i=s;i<=t;i++)++gap[dis[i]];
  43. for(int i=s;i<=t;i++)fron[i]=fir[i];
  44. int p=s;
  45. double f,ret=;
  46. while(dis[s]<=t){
  47. if(p==t){
  48. f=INF;
  49. while(p!=s){
  50. f=min(f,cap[path[p]]);
  51. p=to[path[p]^];
  52. }
  53. ret+=f;p=t;
  54. while(p!=s){
  55. cap[path[p]]-=f;
  56. cap[path[p]^]+=f;
  57. p=to[path[p]^];
  58. }
  59. }
  60. int &ii=fron[p];
  61. for(;ii;ii=nxt[ii])
  62. if(cap[ii]>eps&&dis[p]==dis[to[ii]]+)
  63. break;
  64. if(ii)
  65. path[p=to[ii]]=ii;
  66. else{
  67. if(--gap[dis[p]]==)break;
  68. int minn=t+;
  69. for(int i=fir[p];i;i=nxt[i])
  70. if(cap[i]>eps)minn=min(minn,dis[to[i]]);
  71. ++gap[dis[p]=minn+];ii=fir[p];
  72. if(p!=s)p=to[path[p]^];
  73. }
  74. }
  75. return ret;
  76. }
  77.  
  78. int ch[maxm],ans;
  79. void Init(){
  80. memset(fir,,sizeof(fir));
  81. memset(gap,,sizeof(gap));
  82. memset(ch,,sizeof(ch));
  83. cnt=;
  84. }
  85.  
  86. double Solve(double lam){
  87. Init();
  88. double ret=0.0;
  89. for(int i=;i<=m;i++){
  90. if(e[i][]-lam<-eps){
  91. ret+=e[i][]-lam;
  92. ch[i]=;
  93. }
  94. else{
  95. addedge(e[i][],e[i][],e[i][]-lam,i);
  96. addedge(e[i][],e[i][],e[i][]-lam,i);
  97. }
  98. }
  99. ret+=ISAP(,n);
  100. for(int i=;i<=cnt;i++)
  101. if(fabs(cap[i])<eps&&ID[i])ch[ID[i]]=;
  102. return ret;
  103. }
  104.  
  105. int main(){
  106. #ifndef ONLINE_JUDGE
  107. freopen("networkwar.in","r",stdin);
  108. freopen("networkwar.out","w",stdout);
  109. #endif
  110. while(true){
  111. scanf("%d%d",&n,&m);
  112. if(!n&&!m)break;
  113. for(int i=;i<=m;i++)
  114. for(int j=;j<=;j++)
  115. scanf("%d",&e[i][j]);
  116. double lo=eps,hi=INF,lam;
  117. for(int t=;t<=;t++){
  118. lam=(lo+hi)/;
  119. if(Solve(lam)>eps)
  120. lo=lam;
  121. else
  122. hi=lam;
  123. if(hi-lo<eps)break;
  124. }
  125. ans=;
  126. for(int i=;i<=m;i++)
  127. if(ch[i])ans+=;
  128. printf("%d\n",ans);
  129. for(int i=;i<=m;i++)
  130. if(ch[i])printf("%d ",i);
  131. printf("\n\n");
  132. }
  133. return ;
  134. }

图论(网络流,分数规划):COGS 2047. [ZOJ2676]网络战争的更多相关文章

  1. ZOJ 2676 Network Wars(网络流+分数规划)

    传送门 题意:求无向图割集中平均边权最小的集合. 论文<最小割模型在信息学竞赛中的应用>原题. 分数规划.每一条边取上的代价为1. #include <bits/stdc++.h&g ...

  2. 【BZOJ3597】方伯伯运椰子(分数规划,网络流)

    [BZOJ3597]方伯伯运椰子(分数规划,网络流) 题解 给定了一个满流的费用流模型 如果要修改一条边,那么就必须满足流量平衡 也就是会修改一条某两点之间的路径上的所有边 同时还有另外一条路径会进行 ...

  3. 【BZOJ2285】[SDOI2011]保密(分数规划,网络流)

    [BZOJ2285][SDOI2011]保密(分数规划,网络流) 题面 BZOJ 洛谷 题解 首先先读懂题目到底在干什么. 发现要求的是一个比值的最小值,二分这个最小值\(k\),把边权转换成\(t- ...

  4. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

  5. 【BZOJ4819】新生舞会(分数规划,网络流)

    [BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...

  6. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  7. BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】

    题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...

  8. 【XSY2718】gift 分数规划 网络流

    题目描述 有\(n\)个物品,买第\(i\)个物品要花费\(a_i\)元.还有\(m\)对关系:同时买\(p_i,q_i\)两个物品会获得\(b_i\)点收益. 设收益为\(B\),花费为\(A\), ...

  9. 【bzoj 3232】圈地游戏(算法效率--01分数规划+图论--最小割)

    题目:DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用.DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走 ...

随机推荐

  1. 10.29 morning

    WPS转word太丑了 凑合看喽 第二题 [题目描述] 给你两个日期,问这两个日期差了多少毫秒. [输入格式] 两行,每行一个日期,日期格式保证为“YYYY-MM-DD hh:mm:ss ”这种形式. ...

  2. Unity3D GUI之自定义风格组件

    GUI中可以使用一些默认的组件,里面的最后一个参数一般情况下,不设置就是默认的 ,当然也可以进行手动的指定,比如: GUI.Button(new Rect(0,0,100,100),"开始游 ...

  3. HTML5 TypeArray和Unicode 字符之间转换

    1.Uint32Array测试成功 // Uint32Array 测试成功 //字符串转为ArrayBuffer对象 function strToab() { var str = '张三丰'; var ...

  4. android 简单的开机自启

    今天我们主要来探讨android怎么让一个service开机自动启动功能的实现.Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android.in ...

  5. Java方法-数组

    [Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...

  6. 关于mssql数据库锁和事务隔离级别

    事务隔离级别有4种,这4种级别只是对于读操作,也就是select有不同程度的支持, 读未提交:不会对事务里读出来的数据附加任何锁 读已提交:会对事务里读出来的数据附加共享锁,读完就释放共享锁,其他事务 ...

  7. [转帖]FPGA--Vivado

    来源:http://home.eeworld.com.cn/my/space-uid-639749-blogid-267593.html 一般的,在Verilog中最常用的编码方式有二进制编码(Bin ...

  8. Kettle的集群排序 2——(基于Windows)

    5.使用kettle集群模式对相关的数据进行排序 既然,基于Carte服务程序所搭建的集群已经在Spoon中设定好了, 可以首先,先来启动四个节点: "以管理员身份运行"打开 四个 ...

  9. ng-view和ng-include之间的区别

    ng-view通过使用路由控制,可以方便的实现页面组合,但一个html文件中,只能有一个ng-view,他是可以被ctl控制的.ng-include就是将多个页面的公共页面提取出来,如header.h ...

  10. CI 笔记3 (easyui 的layout布局,最小化layout原型)

    在做easyui的layout的布局时,最小化一个原型,分2步,一个是div的父标签,一个是body做父标签,全屏的. 步骤分别为: 在设置的5个区中,div的最后一个,必须是data-options ...