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个整数,代表购买线路的编号,编号是它们在输入文件被给处的顺序

每组数据之间有一个空行

【样例输入】

6 8
1 2 3
1 3 2
2 4 2
2 5 2
3 4 2
3 5 2
5 6 3
4 6 3
4 5
1 2 2
1 3 2
2 3 1
2 4 2
3 4 2
0 0

【样例输出】

4
3 4 5 6 3
1 2 3   可以看看2007胡博涛的论文。
 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=;
const int maxm=;
const double eps=1e-;
const int INF=;
int n,m,e[maxm][];
int cnt,fir[maxn],to[maxm],nxt[maxm],ID[maxm];
double cap[maxn];
void addedge(int a,int b,double c,int id){
nxt[++cnt]=fir[a];
fir[a]=cnt;
ID[cnt]=id;
cap[cnt]=c;
to[cnt]=b;
} queue<int>q;
int dis[maxn];
bool BFS(int s,int t){
memset(dis,,sizeof(dis));
dis[t]=;q.push(t);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=fir[x];i;i=nxt[i])
if(!dis[to[i]]){
dis[to[i]]=dis[x]+;
q.push(to[i]);
}
}
return dis[s];
} int fron[maxn];
int gap[maxn],path[maxn];
double ISAP(int s,int t){
if(!BFS(s,t))return ;
for(int i=s;i<=t;i++)++gap[dis[i]];
for(int i=s;i<=t;i++)fron[i]=fir[i];
int p=s;
double f,ret=;
while(dis[s]<=t){
if(p==t){
f=INF;
while(p!=s){
f=min(f,cap[path[p]]);
p=to[path[p]^];
}
ret+=f;p=t;
while(p!=s){
cap[path[p]]-=f;
cap[path[p]^]+=f;
p=to[path[p]^];
}
}
int &ii=fron[p];
for(;ii;ii=nxt[ii])
if(cap[ii]>eps&&dis[p]==dis[to[ii]]+)
break;
if(ii)
path[p=to[ii]]=ii;
else{
if(--gap[dis[p]]==)break;
int minn=t+;
for(int i=fir[p];i;i=nxt[i])
if(cap[i]>eps)minn=min(minn,dis[to[i]]);
++gap[dis[p]=minn+];ii=fir[p];
if(p!=s)p=to[path[p]^];
}
}
return ret;
} int ch[maxm],ans;
void Init(){
memset(fir,,sizeof(fir));
memset(gap,,sizeof(gap));
memset(ch,,sizeof(ch));
cnt=;
} double Solve(double lam){
Init();
double ret=0.0;
for(int i=;i<=m;i++){
if(e[i][]-lam<-eps){
ret+=e[i][]-lam;
ch[i]=;
}
else{
addedge(e[i][],e[i][],e[i][]-lam,i);
addedge(e[i][],e[i][],e[i][]-lam,i);
}
}
ret+=ISAP(,n);
for(int i=;i<=cnt;i++)
if(fabs(cap[i])<eps&&ID[i])ch[ID[i]]=;
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen("networkwar.in","r",stdin);
freopen("networkwar.out","w",stdout);
#endif
while(true){
scanf("%d%d",&n,&m);
if(!n&&!m)break;
for(int i=;i<=m;i++)
for(int j=;j<=;j++)
scanf("%d",&e[i][j]);
double lo=eps,hi=INF,lam;
for(int t=;t<=;t++){
lam=(lo+hi)/;
if(Solve(lam)>eps)
lo=lam;
else
hi=lam;
if(hi-lo<eps)break;
}
ans=;
for(int i=;i<=m;i++)
if(ch[i])ans+=;
printf("%d\n",ans);
for(int i=;i<=m;i++)
if(ch[i])printf("%d ",i);
printf("\n\n");
}
return ;
}

图论(网络流,分数规划):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. Linux PATH变量的设置

    一般Linux系统,有两个配置文件可以设置PATH变量,一:.bashrc 二:.bash_profile; 还有一种方法可以临时设置PATH变量(三) 一:  1.编辑.bashrc,添加 expo ...

  2. C#开发学习——内联表达式

    <%@ 表示:引用 <%# 表示:绑定 <%= 表示:取值     <%= 变量名%> Response.Write()输出和<%=%>输出最后的效果是一样的 ...

  3. HTML5移动开发中的input输入框类型

    HTML5规范引入了许多新的input输入框类型 在HTML5移动开发中,通过这些新的输入框类型来显示定制后的键盘布局,用户体验更好,更容易填写各种表单 本文中,实测手机为肾4S与米4 数字类型num ...

  4. 原生JS+tween.js模仿微博发布效果

    转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4816865.html 1.先看效果吧,有效果才有动力: 2.html结构: <!DOCTYPE ht ...

  5. maven提示错误的解决办法

    import或者new一个的maven project的时候,提示如下错误 Description    Resource    Path    Location    TypeCannot read ...

  6. 详细查看数据库SQL执行计划

    DBCC DROPCLEANBUFFERS 清除数据缓存DBCC FREEPROCCACHE  清除执行计划缓存 SET SHOWPLAN_XML ON 此语句导致 SQL Server 不执行 Tr ...

  7. OpenCart 之registry功用

    1. “Registry”设计模式 在OpenCart中,Registry是整个系统的信息中枢. Registry是一个单例(Singleton),在index.php起始页面中, 首先作为构造函数参 ...

  8. oracle 数据库关闭的的几种方式总结

    shutdown的几种方式,shutdown abort的一些弊端有哪些   1.shutdown normal        正常方式关闭数据库.    2.shutdown immediate   ...

  9. SGU 143.Long Live the Queen(女王万岁)

    时间限制:0.25s 空间限制:4M 题意: 有n(n<=16000)个小镇,每两个小镇有且仅有一条路径相连.每个小镇有一个收益x(-1000<=x<=1000). 现在要求,选择一 ...

  10. laravel4通过控制视图模板路劲来动态切换主题

    通过控制视图模板路劲来动态切换主题 App::before(function($request) { $paths = Terminal::isMobile() ? array(__dir__.'/v ...