题意:求最小割集\(C\),使得\(\frac{\sum_{i∈C} cost_i}{|C|}\)最小

模型就是01分数规划\(\frac{\sum_{i=1}^{m}cost_i*x}{\sum_{i=1}^{m}c_i*x}\),其中\(c_i\)恒为1,\(x\)为\(0\)或\(1\)

令上式为\(λ\),简单变换后有\(\sum_{i=1}^{m}(cost_i-1*λ)x_i\),利用单调性进行二分,迭代时边的代价为\(cost_i-λ\)

整型模板改了下发现跑不动图,随便网上捡了个模板(`・ω・)

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i = j; i <= k; i++)
#define repp(i,j,k) for(int i = j; i < k; i++)
#define rrep(i,j,k) for(int i = j; i >= k; i--)
#define erep(i,u) for(int i = head[u]; ~i; i = nxt[i])
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define scannn(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define println(a) printf("%d\n",a)
#define printbk(a) printf("%d ",a)
#define print(a) printf("%d",a)
using namespace std;
const int maxn = 1e3+11;
const double oo = 1e12;
const double eps = 1e-7;
typedef long long ll;
int to[maxn<<1],nxt[maxn<<1];
double cap[maxn<<1];
int head[maxn],tot;
void init(){
memset(head,-1,sizeof head);
tot=0;
}
void add(int u,int v,double w){
to[tot]=v;
nxt[tot]=head[u];
cap[tot]=w;
// flow[tot]=0;
head[u]=tot++;
swap(u,v);
to[tot]=v;
nxt[tot]=head[u];
cap[tot]=w;
// flow[tot]=0;
head[u]=tot++;
}
int h[maxn],num[maxn],vis[maxn];
int s,t,n,m;
double aug(int u,double flow){ // double!!!
if(u==t) return flow;
double l=flow;
int tmp=n-1;
erep(i,u){
int v=to[i];
if(h[u]==h[v]+1&&cap[i]>eps){
double f=aug(v,min(l,cap[i]));
l-=f;cap[i]-=f;cap[i^1]+=f;
if(l<eps||h[s]==n) return flow-l;
}
if(cap[i]>eps&&h[v]<tmp) tmp=h[v];
}
if(l==flow){
num[h[u]]--;
if(num[h[u]]==0) h[s]=n;
else{
h[u]=tmp+1;
num[h[u]]++;
}
}
return flow-l;
}
double isap(){
double ans=0;
memset(h,0,sizeof h);
memset(num,0,sizeof num);
num[0]=n;
while(h[s]<n) ans+=aug(s,oo);
return ans;
} void dfs(int u){
erep(i,u){
int v=to[i];
if(cap[i]>eps&&!vis[v]){
vis[v]=1;
dfs(v);
}
}
}
int a[maxn],b[maxn];
double c[maxn];
bool C(double lambda){
init();
double ans=0;
rep(i,1,m){
if(c[i]-lambda<0){
ans+=c[i]-lambda;
}else{
add(a[i],b[i],c[i]-lambda);
}
}
ans+=isap();
return ans>eps;
}
int main(){
while(cin>>n>>m){
rep(i,1,m) cin>>a[i]>>b[i]>>c[i];
s=1;t=n;
double lo=0,hi=1e8,mid;
rep(i,1,50){
mid=(hi+lo)/2.0;
if(C(mid)) lo=mid;
else hi=mid;
}
double lambda=mid;
memset(vis,0,sizeof vis);
vis[s]=1; dfs(s);
int ans=0; vector<int> vec;
rep(i,1,m){
if(vis[a[i]]+vis[b[i]]==1||c[i]+eps<lambda){
ans++;
vec.push_back(i);
}
}
println(ans);
for(int i=0;i<vec.size();i++){
if(i==vec.size()-1)println(vec[i]);
else printf("%d ",vec[i]);
}
}
return 0;
}

ZOJ - 2676 01分数规划 浮点ISAP的更多相关文章

  1. zoj 2676 二分+ISAP模板求实型参数的最小割(0-1分数规划问题)(可做ISAP模板)

    /* 参考博文:http://www.cnblogs.com/ylfdrib/archive/2010/09/01/1814478.html 以下题解为转载代码自己写的: zoj2676 胡伯涛论文& ...

  2. ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)

    [题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...

  3. zoj 2676 Network Wars 0-1分数规划+最小割

    题目详解出自 论文 Amber-最小割模型在信息学竞赛中的应用 题目大意: 给出一个带权无向图 G = (V,E), 每条边 e属于E都有一个权值We,求一个割边集C,使得该割边集的平均边权最小,即最 ...

  4. 【转】[Algorithm]01分数规划

    因为搜索关于CFRound277.5E题的题解时发现了这篇文章,很多地方都有值得借鉴的东西,因此转了过来 原文:http://www.cnblogs.com/perseawe/archive/2012 ...

  5. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  6. POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)

    [题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...

  7. 【Earthquake, 2001 Open 】 0-1 分数规划

    71  奶牛施工队一场地震把约翰家园摧毁了,坚强的约翰决心重建家园.约翰已经修复了 N 个牧场,他需要再修复一些道路把它们连接起来.碰巧的是,奶牛们最近也成立了一个工程队,专门从事道路修复.而然,奶牛 ...

  8. POJ 2976 Dropping tests 01分数规划

    给出n(n<=1000)个考试的成绩ai和满分bi,要求去掉k个考试成绩,使得剩下的∑ai/∑bi*100最大并输出. 典型的01分数规划 要使∑ai/∑bi最大,不妨设ans=∑ai/∑bi, ...

  9. codevs 1183 泥泞的道路 01分数规划

    题目链接 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和 ...

随机推荐

  1. SQL Server CLR全功略之一---CLR介绍和配置

    Microsoft SQL Server 现在具备与 Microsoft Windows .NET Framework 的公共语言运行时 (CLR) 组件集成的功能.CLR 为托管代码提供服务,例如跨 ...

  2. SQL 数据排重,去掉重复数据 有用

    .最大的错误:    在对数据排重的时候,首先想到的就是Distinct,虽然这很管用,但多数场合下不适用,因为通常排重后还要做进一步处理,比如对编号排重后要按日期统计等. 无法排重的Group by ...

  3. Mybatis和Hibernate比较

    作者:乌拉拉链接:http://www.zhihu.com/question/21104468/answer/58579295来源:知乎著作权归作者所有,转载请联系作者获得授权. 1.开发对比开发速度 ...

  4. 在线创建MongoDB免费集群(MangoDB Atlas)

    MongoDB Atlas是MongoDB的云服务,构建在亚马逊的AWS上,MongoDB允许用户在上面创建一个免费集群作为学习使用. 1. 注册MongoDB cloud账号: 访问www.mong ...

  5. 自定义JTabbedPane 标签风格

    自定义JTabbedPane 标签风格 2012年03月09日 20:33:12 阅读数:2435 demo 下载地址:http://download.csdn.net/detail/jinannan ...

  6. (转)什么?你还不会写JQuery 插件

    原文地址:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jque ...

  7. [算法基础]Big O Notation时间复杂度计算方法

    首先一点就是无视任何常量 从最简单的开始 statement; 这段时间复杂度为常数1,所以O(1). 然后 ; i < N; i++ ) statement; 这一段是线性的,则时间复杂度为N ...

  8. spring是如何由请求地址找到对应的control的

    spring先将所有的action bean放进内存中,然后根据@RequestMapping(value = "/", method = RequestMethod.GET)这种 ...

  9. C++程序的目录结构、编译、打包、分发

    管理C++的第三方库以及编译 第三方库这个说法,不知道出自哪里,但一般是指开发者,系统/平台提供商之外的第三个参与者提供的程序库. 大多数开源软件库在软件系统中都是第三方库. 完全不使用库的开发,在9 ...

  10. C# File类常用方法

    File 类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. 1. File.Exists ——  确定指定的文件是否存在. public static ...