Network Wars

07年胡伯涛的论文上的题:http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html

代码:

#include <algorithm>
#include <cstdio>
#include <iterator>
#include <limits>
#include <vector>
#include <string.h> const int N = 111;
const int M = 404;
const double EPS = 1e-3; typedef std::vector<int> VI; int signum(double x) {
return x > EPS ? 1 : (x < -EPS ? -1 : 0);
} template<int N, int M, class Flow>
struct Dinic {
int n, e, first[N], cur[N], next[M], to[M], id[M], s, t;
int pre[N], level[N], q[N], sign;
Flow cap[M], flow;
void add(int u, int v, Flow w, int i) {
to[e] = v;
cap[e] = w;
id[e] = i;
next[e] = first[u];
first[u] = e++;
}
bool bfs(int s, int t) {
std::fill(level+1, level + n + 1, -1);
sign = t;
level[t] = 0;
int head = 0, tail = 0;
q[tail++] = t;
while (head != tail && level[s] == -1) {
int u = q[head++];
for (int it = first[u]; it != -1; it = next[it]) {
if (cap[it ^ 1] > 0 && level[to[it]] == -1) {
level[to[it]] = level[u] + 1;
q[tail++] = to[it];
}
}
}
return level[s] != -1;
}
void push() {
Flow delta = std::numeric_limits<Flow>::max();
int u, p;
for (u = t; u != s; u = to[p ^ 1]) {
p = pre[u];
delta = std::min(delta, cap[p]);
}
for (u = t; u != s; u = to[p ^ 1]) {
p = pre[u];
cap[p] -= delta;
if (!cap[p]) {
sign = to[p ^ 1];
}
cap[p ^ 1] += delta;
}
flow += delta;
}
void dfs(int u) {
if (u == t) {
push();
} else {
for (int & it = cur[u]; it != -1; it = next[it]) {
if (cap[it] > 0 && level[u] == level[to[it]] + 1) {
pre[to[it]] = it;
dfs(to[it]);
if (level[sign] > level[u]) {
return;
}
sign = t;
}
}
level[u] = -1;
}
}
void init(int _n, int _s, int _t) {
n = _n, s = _s, t = _t;
std::fill(first + 1 , first + n + 1 , -1);
e = 0;
}
Flow solve() {
flow = 0;
while (bfs(s, t)) {
for (int i = 1; i <= n; ++i) {
cur[i] = first[i];
}
dfs(s);
}
return flow;
}
}; Dinic<N,M<<1,double> AC ;
int left[M] , right[M] , w[M] ;
int n , m , mark[M] ; double judge ( double key ) {
double sum = 0 ;
memset ( mark , 0 , sizeof ( mark ) ) ;
AC.init ( n , 1 , n ) ;
for ( int i = 1 ; i <= m ; i ++ )
if ( w[i] <= key ) {
sum += w[i] - key ;
mark[i] = 1 ;
} else {
AC.add ( left[i] , right[i] , w[i] - key , i ) ;
AC.add ( right[i] , left[i] , w[i] - key , i ) ;
}
double add = AC.solve () ;
sum += add ;
return sum ;
} void solve () {
double l = 0 , r = (double) m * 1e7 ;
while ( signum (r-l) > 0 ) {
double mid = ( l + r ) / 2.0 ;
double k = judge ( mid ) ;
if ( signum ( k ) >= 0 ) l = mid ;
else r = mid ;
}
AC.bfs ( 1 , n ) ;
for ( int i = 0 ; i < AC.e ; i ++ ) {
int u = AC.to[i^1] , v = AC.to[i] ;
if ( AC.level[u] == -1 && AC.level[v] != -1 )
mark[AC.id[i]] = 1 ;
}
int ans = 0 ;
for ( int i = 1 ; i <= m ; i ++ ) if ( mark[i] ) ans ++ ;
printf ( "%d\n" , ans ) ;
for ( int i = 1 ; i <= m ; i ++ ) if ( mark[i] ) printf ( "%d " , i ) ;
puts ( "" ) ;
} int main () {
// freopen("network.in", "r", stdin);
// freopen("network.out", "w", stdout);
int flag = 0 ;
while ( scanf ( "%d%d" , &n , &m ) != EOF ) {
for ( int i = 1 ; i <= m ; i ++ )
scanf ( "%d%d%d" , &left[i] , &right[i] , &w[i] ) ;
if ( flag ) puts ( "" ) ;
flag = 1 ;
solve () ;
}
return 0 ;
}

zoj2676 Network Wars(0-1分数规划,最大流模板)的更多相关文章

  1. poj 2976 Dropping tests 0/1分数规划

    0/1分数规划问题,用二分解决!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> # ...

  2. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  3. LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP+0/1分数规划

    题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...

  4. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  5. POJ - 2976 Dropping tests && 0/1 分数规划

    POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} ...

  6. [SDOI2017]新生舞会 0/1分数规划

    ---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...

  7. bzoj3232圈地游戏——0/1分数规划+差分建模+判环

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

  8. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

  9. Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)

    题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...

  10. Luogu P1768 天路 0/1分数规划+dfs spfa

    “那是一条神奇的天路诶~~把第一个神犇送上天堂” 怕不是某大佬早就A了这题,然鹅我又调了很久很久... 好吧就是0/1分数规划,但是跑的dfs的spfa(好像题解说bfs过不了????不知) 发现把s ...

随机推荐

  1. SCOI2014题解

    SCOI2014由极不靠谱的电子坑爹大学出题.电子坑爹大学打破了多年行规,暴力+NOIP500分居然不能进队.极其逗比的第一天暴力给10分!!还好有些题不是很难,省队爷分数大概在150以上(最高420 ...

  2. 上传Android代码到gerrit服务器

    1. 配置default.xml default.xml是跟Android代码配套的,可参考google Android源码下的default.xml(.repo/manifests/default. ...

  3. Leetcode0133--Clone Graph 克隆无向图

    [转载请注明]:https://www.cnblogs.com/igoslly/p/9699791.html 一.题目 二.题目分析 给出一个无向图,其中保证每点之间均有连接,给出原图中的一个点 no ...

  4. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  5. (转) Arcgis for Javascript实现两个地图的联动

    http://blog.csdn.net/gisshixisheng/article/details/40127895 今天在看天地图的时候,有一个多时相的地图显示功能,感觉很好玩,作为技术控的我晚上 ...

  6. mysql_数据查询_连接查询

    连接查询 1.连接(join) 也称θ连接,从两个关系的笛卡尔积中选择属性间满足一定条件的元组. 等值连接:θ为“=”的连接运算称为等值连接.从关系R和S的广义笛卡尔积中选取A.B属性值相等的元组. ...

  7. Eclipse 使用前的配置

    一,修改eclipse对jdk的依赖项 1.查看设置的编译器编译版本:设置成本地jdk一致的版本 点击窗口->首选项 找到java 选择编辑器,查看现在的编译jdk版本 改成本地jdk版本 jd ...

  8. sysbench测试阿里云ECS云磁盘的IOPS,吞吐量

    测试阿里云ECS 对象:在aliyun上买了一个ECS附加的云盘,使用sysbench测试云盘的IOPS和吞吐量 sysbench prepare 准备文件,10个文件,1个1G [root@iZwz ...

  9. 通过JS唤醒app(安卓+ios)

    有需求说要通过页面按钮唤醒app,或者手机上没有这款app跳转到商店,然后刚开始也是查了资料的,结果发现一头雾水,不过最后还是捣鼓出来了,当然也参考了前人分享的经验,下面我就将方法整理一下: 首先明确 ...

  10. 关于img的一个小知识点

    这两天在撸代码的时候发现图片的最下面总是会留一条空白,刚开始不知道为什么,但是UI拿刀对我说去掉它,瑟瑟发抖的我找了下原因及解决方案. 原因:img 是一个inline-block标签,而这个标签的v ...