zju2676 Network Wars 分数规划+网络流
题意:给定无向图,每条边有权值,求该图的一个割集,是的该割集的平均边权最小
Amber的《最小割模型在信息学竞赛中的应用》中讲的很清楚了。
二分答案k,对每条边进行重新赋值为原边权-k,求最大流,
可看这里:http://hi.baidu.com/buaa_babt/item/a08fbb45599dc722fb89602a
二分枚举当前的平均边长l,对于边权<=l的直接加入当前最优割集,边权>l的将容量设为边权-l,加入到网络中,求出最小割的和sum,sum加上刚刚那些小于l的边(也是边权-l),如果大于0就意味着l不可作为最小平均边权,小于0就可以,当等于0时直接输出即可。一定要注意精度
注意是无向图,还有就是求st割,求解答案。
#define inf 0x3f3f3f3f
#define maxm 100000
#define maxn 10000
#define eps 1e-9
struct node
{
int u ;
int v,next,id;
double w;
void init(int u1,int v1,double w1)
{
u = u1;
v = v1;
w = w1;
}
};
node e1[maxn];
int head[maxn];
int cnt ;
int cnt1;
node edge[maxn];
int sgn(double x) { //return -1 0 1
return x < -eps ? - : x > eps;
}
void init()
{
memset(head,-,sizeof(head));
cnt = ;
}
void add(int u,int v,int id,double w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].id = id;
edge[cnt].next = head[u];
head[u] = cnt ++ ; edge[cnt].u = v;
edge[cnt].v = u;
edge[cnt].w = ;
edge[cnt].id = id;
edge[cnt].next = head[v];
head[v] = cnt ++ ;
} int dis[maxn];
int pre[maxn],cur[maxn],gap[maxn];
int s,t,nn; int sap()
{
double flow,aug;
int u;
int flag;
int i;
flow=;
aug=inf;
for(i=; i<nn; i++)
{
cur[i]=head[i];
gap[i]=;
dis[i]=;
}
gap[s]=nn;
u=s;
pre[s]=s;
while(dis[s]<nn)
{
flag=;
for(int &j=cur[u]; j!=-; j=edge[j].next)
{
//cur[u]=j;
int v=edge[j].v;
if(edge[j].w>&&dis[u]==dis[v]+)
{
flag=;
if(edge[j].w<aug)aug=edge[j].w;
pre[v]=u;
u=v;
if (u==t)
{
flow+=aug;
while(u!=s)
{
u=pre[u];
edge[cur[u]].w-=aug;
edge[cur[u]^].w+=aug;
//why?解释偶数异或1为偶数+1,奇数异或1为奇数-1,
//显然我们存的边是从0开始存的,
//所以偶数,偶数+1是残量网格中的两条边(无向边)
}
aug=inf;
}
break;
}
}
if (flag) continue;
int mindis=nn;
for(int j=head[u]; j!=-; j=edge[j].next)
{
int v=edge[j].v;
if (edge[j].w>&&dis[v]<mindis)
{
mindis=dis[v];
cur[u]=j;
}
}
if (--gap[dis[u]]==)//间隙优化
{
break;
}
dis[u]=mindis+;
gap[dis[u]]++;
u=pre[u];
}
return flow;
}
bool xxx[maxn];
int n,m;
double judge(double lda)
{
memset(xxx,,sizeof(xxx));
init();
double res = 0.0;
for(int i = ; i <= m ; i ++)
{
double tmp ;
tmp = e1[i].w - lda;
if( tmp >= )
add(e1[i].u,e1[i].v,i,tmp) , add(e1[i].v,e1[i].u,i,tmp); // 注意
else
{
res += tmp;
xxx[i] = ;
}
//if(sgn(tmp) < 0 )
// res += tmp ;
//else add(e1[i].u,e1[i].v,i,tmp);
}
s = ;
t = n ;
nn = t + ;
res += sap();
return res;
}
queue<int> q;
int col[maxn];
bool vis[maxn];
void bfs(int st,int color)
{
memset(vis,,sizeof(vis));
memset(col,,sizeof(col));
while(!q.empty()) q.pop();
q.push(st);
vis[st] = ;
col[st] = color;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u] ; i != -; i = edge[i].next)
{
int v = edge[i].v;
if(sgn(edge[i].w) > && vis[v] == )
{
vis[v] = ;
col[v] = color;
q.push(v);
}
}
}
return ;
}
vector<int> ans ;
void getst(double lda)
{
bfs(,);
ans.clear();
for(int i = ; i <= m ; i ++ ) // 注意
{
if(!xxx[i])
{
if(col[e1[i].u] != col[e1[i].v] )
{
ans.push_back(i);
}
}
else ans.push_back(i);
}
int size = ans.size();
sort(ans.begin(),ans.end());
printf("%d\n",size);
for(int i = ; i < size ; i++ )
{
printf("%d",ans[i]);
if(i != size - ) printf(" ");
else printf("\n");
}
}
int main()
{
int cas;
cas = ;
while(scanf("%d%d",&n,&m)!=EOF)
{
cnt1 = ;
int u,v;
double w;
double L,R;
L = eps;
for(int i = ; i <= m; i ++ )
{
scanf("%d%d%lf",&u,&v,&w);
e1[i].init(u,v,w);
R = max(R , w);
}
double mid ;
for(int i = ; i < ; i ++ )
// while( R - L > eps )
{
mid = ( L + R ) / 2.0;
double tmp = judge(mid);
if(sgn(tmp ) > ) // 判断
L = mid + eps;
else R = mid;
}
if(cas != ) printf("\n");
cas ++ ;
judge(L);
getst(L);
}
return ;
}
zju2676 Network Wars 分数规划+网络流的更多相关文章
- BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】
题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...
- 【XSY2718】gift 分数规划 网络流
题目描述 有\(n\)个物品,买第\(i\)个物品要花费\(a_i\)元.还有\(m\)对关系:同时买\(p_i,q_i\)两个物品会获得\(b_i\)点收益. 设收益为\(B\),花费为\(A\), ...
- bzoj 1312: Hard Life 01分数规划+网络流
题目: Description 在一家公司中,人事部经理与业务部经理不和.一次,总经理要求人事部从公司的职员中挑选出一些来帮助业务部经理完成一项任务.人事部经理发现,在公司的所有职员中,有一些人相处得 ...
- ZOJ 2676 Network Wars(网络流+分数规划)
传送门 题意:求无向图割集中平均边权最小的集合. 论文<最小割模型在信息学竞赛中的应用>原题. 分数规划.每一条边取上的代价为1. #include <bits/stdc++.h&g ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- zoj 2676 Network Wars 0-1分数规划+最小割
题目详解出自 论文 Amber-最小割模型在信息学竞赛中的应用 题目大意: 给出一个带权无向图 G = (V,E), 每条边 e属于E都有一个权值We,求一个割边集C,使得该割边集的平均边权最小,即最 ...
- ZOJ 2676 Network Wars[01分数规划]
ZOJ Problem Set - 2676 Network Wars Time Limit: 5 Seconds Memory Limit: 32768 KB Special J ...
- zoj2676 Network Wars(0-1分数规划,最大流模板)
Network Wars 07年胡伯涛的论文上的题:http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html 代码: #include < ...
- 【BZOJ2285】[SDOI2011]保密(分数规划,网络流)
[BZOJ2285][SDOI2011]保密(分数规划,网络流) 题面 BZOJ 洛谷 题解 首先先读懂题目到底在干什么. 发现要求的是一个比值的最小值,二分这个最小值\(k\),把边权转换成\(t- ...
随机推荐
- IOS开发-表视图LV3导航控制器
学到这里感觉有点难了,其实这篇文章再草稿箱里放了好久了~ 最近对于学习的热情下降了.这不行-抓紧学习走起! 在这一章节的学习中主要针对导航控制器及表视图来建立多视图的应用, 首先要了解一些概念-- 1 ...
- SQLSERVER图片查看工具SQL Image Viewer5.5.0.156
原文:SQLSERVER图片查看工具SQL Image Viewer5.5.0.156 SQLSERVER图片查看工具SQL Image Viewer5.5.0.156 在2013年某一次北京SQL ...
- Google的Guava它Collection升华
至于Guava这是不是在这里说.一个已被提上一个非常特殊的! 这主要是为了分享Guava对于一些升华处理组.井,不多说了,直接在代码: package com.joyce.guava.bean; /* ...
- Makefile学习(一)[第二版]
简单介绍 1)make:利用 make 工具能够自己主动完毕编译工作.这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头 ...
- Codeforces Round #258 (Div. 2) B. Sort the Array
题目链接:http://codeforces.com/contest/451/problem/B 思路:首先找下降段的个数,假设下降段是大于等于2的,那么就直接输出no,假设下降段的个数为1,那么就把 ...
- ViewRootImpl和WindowManagerService笔记
1.每个窗体的ViewRootImpl都有一个mWindowAttributes窗体属性,该属性在WindowManagerGlobal.updateViewLayout()->ViewRoot ...
- Java的结构之美【2】——销毁对象
先来看一段代码: import java.util.Arrays; import java.util.EmptyStackException; /** * 2014年6月28日09:31:59 * @ ...
- Twitter实时搜索系统EarlyBird
twitter要存档tweet采用lucene做全量指数,新发型是实时索引推文.检索实时(10在几秒钟内指数).实时索引和检索系统,称为EarlyBird. 感觉写更清晰,简洁,这个信息是真实的,只有 ...
- MAC 10.10 apache 服务器配置
mac中自带了apache服务器, 如果需要在mac上使用apache服务器, 只需要配置并启动服务器即可. mac 10.10 中自带的apache版本是 2.4 mac 10.9 中自带的apac ...
- 【C语言探索之旅】 开宗明义及第一课:什么是编程?
内容简介 1.课程大纲 2.第一部分第一课:什么是编程? 3.第一部分第二课预告:工欲善其事,必先利其器 课程大纲 不知道为什么,一直对C语言有一种很深厚的“情怀”(类似老罗对锤子手机的那种),说 ...