题意:给定无向图,每条边有权值,求该图的一个割集,是的该割集的平均边权最小

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 分数规划+网络流的更多相关文章

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

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

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

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

  3. bzoj 1312: Hard Life 01分数规划+网络流

    题目: Description 在一家公司中,人事部经理与业务部经理不和.一次,总经理要求人事部从公司的职员中挑选出一些来帮助业务部经理完成一项任务.人事部经理发现,在公司的所有职员中,有一些人相处得 ...

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

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

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

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

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

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

  7. ZOJ 2676 Network Wars[01分数规划]

    ZOJ Problem Set - 2676 Network Wars Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special J ...

  8. zoj2676 Network Wars(0-1分数规划,最大流模板)

    Network Wars 07年胡伯涛的论文上的题:http://wenku.baidu.com/view/87ecda38376baf1ffc4fad25.html 代码: #include < ...

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

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

随机推荐

  1. leetCode Min Stack解决共享

    原标题:https://oj.leetcode.com/problems/min-stack/ Design a stack that supports push, pop, top, and ret ...

  2. java Socket的怪异之处

    怪异之一: connect(SocketAddress endpoint):这个方法,尝试连接server端,如果连接不上,就抛出IOException异常.如果连接成功了,就继续执行下一步的代码. ...

  3. 【原创】leetCodeOj --- Min Stack 解题报告

    题目地址: https://oj.leetcode.com/problems/min-stack/ 题目内容: Design a stack that supports push, pop, top, ...

  4. Test SRM Level Three: LargestCircle, Brute Force

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3005&rd=5858 思路: 如果直接用Brute F ...

  5. [转载]使用python上传图片到 yeelink

    #/bin/env python # -*-coding:utf=8 -*- import os,time,subprocess,shlex import urllib2 def upload_yee ...

  6. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  7. LeetCode: Distinct Subsequences [115]

    [称号] Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequ ...

  8. android看不见main函数怎么办?程序异常了,能够不提示“xxx软件停止执行”吗?

    今天遇到了这个问题,分享一下解决方式. android没有main 函数,自然也就不存在main里面加入异常处理来实现全局异常捕获的方案.那android程序有全局异常补货的解决方式吗? 答案是有的: ...

  9. ubuntu下一个jboss-seam-2.2.2.Final/examples/build.xml:754: warning: &#39;includeantruntime&#39; was not set

    [javac] /home/huihui/app/jboss-seam-2.2.2.Final/examples/build.xml:754: warning: 'includeantruntime' ...

  10. 使用axis公布weblogic(一个)

    1.在MyEclipse创建一个新的Web Project.新类,声明函数名称.参数,为了不写功能实体. 2.将java2wsdl.bat将文件复制到classes目录,据内部参数更改自己的实际情况 ...