UVA1389 Hard Life[二分答案+最小割]
求最大密度子图方案。密度=边数/点数
假设E,V为最大密度子图的边数点数。则$\forall \rho$有$\rho \leqslant \frac{E}{V}$即$E- \rho V \geqslant 0$,也就是说密度最大时不等式去等号,密度要是小一些的话就应大于0,那可以二分密度寻找最大的密度,判断是否合法的方法:要看左边的等式有没有大于0,那可以把点看成权值是$-\rho$的点,边抽象成权值为$1$的点,且其向连接两端的点连有向边。然后做最大权闭合子图,保证边选上就得把点也给选上。这样得到的最大权大于零说明密度枚举小了,而为零表示枚举值大于等于最大密度。那就通过二分找到那个刚好突变的数就是最大密度,这是停止二分把残量网络跑一遍,得所选点。

这题稍微卡精度,还是说我不太会写浮点数二分答案?很玄学。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
#define dbg(x) cerr<<#x<<" = "<<x<<endl
template<typename T>inline char MIN(T&A,T B){return A>B?A=B,:;}
template<typename T>inline char MAX(T&A,T B){return A<B?A=B,:;}
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline void inc(T&A,T B){A+=B;}
inline int read(int&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+c-'',c=getchar();if(c=='\n')return -;return f?-x:x;
}
const int N=+,M=+;const db eps=1e-,INF=99999999.0;
int Head[N],cur[N],Next[M<<],v[M<<],dis[N],vis[N],tot,n,m,s,t;
db w[M<<];
inline void Addedge(int x,int y,db z){
v[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
v[++tot]=x,Next[tot]=Head[y],Head[y]=tot,w[tot]=;
}
#define y v[j]
inline int bfs(){
queue<int> q;memset(dis,,sizeof dis),dis[s]=,q.push(s);
for(register int i=;i<=(n+m)+;++i)cur[i]=Head[i];
while(!q.empty()){
int x=q.front();q.pop();
for(register int j=Head[x];j;j=Next[j])if(w[j]>&&!dis[y]){
dis[y]=dis[x]+,q.push(y);
if(y==t)return ;
}
}
return ;
}
db dinic(int x,db flow){
if(flow<eps||x==t)return flow;
db rest=flow,k;
for(register int j=cur[x];j&&rest;cur[x]=j,j=Next[j])if(w[j]>&&dis[y]==dis[x]+){
if((k=dinic(y,_min(rest,w[j])))<eps)dis[y]=;
rest-=k,w[j]-=k,w[j^]+=k;
}
return flow-rest;
}
#undef y
int flag,edge[][],cnt;
db L,R,mid,res,maxflow,ans; inline db check(db rho){//dbg(rho);
memset(Head,,sizeof Head);maxflow=ans=;tot=;
for(register int i=;i<=m;++i)ans+=1.0,Addedge(s,i,1.0),Addedge(i,edge[i][]+m,INF),Addedge(i,edge[i][]+m,INF);
for(register int i=;i<=n;++i)Addedge(i+m,t,rho);
while(bfs())maxflow+=dinic(s,INF);
ans-=maxflow;//dbg(maxflow);dbg(ans);
return ans;
}
void dfs(int x){//cerr<<x<<endl;
vis[x]=;for(register int j=Head[x];j;j=Next[j]){
// dbg(v[j]),dbg(w[j]);
if(w[j]>&&!vis[v[j]])dfs(v[j]);
}
} int main(){//freopen("tmp.in","r",stdin);//freopen("tmp.out","w",stdout);
while(~scanf("%d%d",&n,&m)){
if(flag)puts("");else flag=;
if(m==){printf("1\n1\n");continue;}
for(register int i=;i<=m;++i)read(edge[i][]),read(edge[i][]);
L=,R=m/2.0;s=n+m+,t=s+;
while(R-L>eps){//dbg(L),dbg(R);
mid=(L+R)/2.0;db res=check(mid);
if(res<eps)R=mid-eps;
else L=mid;
}
check(L),memset(vis,,sizeof vis),dfs(s);cnt=;
for(register int i=;i<=n;++i)if(vis[i+m])++cnt;
printf("%d\n",cnt);
for(register int i=;i<=n;++i)if(vis[i+m])printf("%d\n",i);
}
return ;
}
UVA1389 Hard Life[二分答案+最小割]的更多相关文章
- 【BZOJ2756】奇怪的游戏(二分,最小割)
题意: Blinker最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blinker 想知道最 ...
- 第十四届华中科技大学程序设计竞赛 K Walking in the Forest【二分答案/最小化最大值】
链接:https://www.nowcoder.com/acm/contest/106/K 来源:牛客网 题目描述 It's universally acknowledged that there'r ...
- Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案
Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...
- 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型
最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那 ...
- 【分块答案】【最小割】bzoj1532 [POI2005]Kos-Dicing
引用zky的题解:http://blog.csdn.net/iamzky/article/details/39667859 每条S-T路径代表一次比赛的结果.最小割会尽量让一个人赢得最多. 因为二分总 ...
- zoj 2676 二分+ISAP模板求实型参数的最小割(0-1分数规划问题)(可做ISAP模板)
/* 参考博文:http://www.cnblogs.com/ylfdrib/archive/2010/09/01/1814478.html 以下题解为转载代码自己写的: zoj2676 胡伯涛论文& ...
- 最大密集子图(01分数规划+二分+最小割)POJ3155
题意:给出一副连通图,求出一个子图令g=sigma(E)/sigma(V); h[g]=sigma(E)-g*sigma(V):设G是最优值 则当h[g]>0:g<G h[g]<0, ...
- BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )
二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...
- [HNOI2009]最小圈 (二分答案+负环)
题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...
随机推荐
- spring中的异步事件
这里讲解一下Spring对异步事件机制的支持,实现方式有两种: 1.全局异步 即只要是触发事件都是以异步执行,具体配置(spring-config-register.xml)如下: Java代码 ...
- Window下安装Gradle并在IDEA中配置
真是作死啊,Maven都只是用得半瓢水,还来搞Gradle,小心撩得一身骚啊. 下载Gradle 下载页面为:https://gradle.org/releases/ Gradle 4.1的下载地址: ...
- JVM中垃圾收集选项
最初并发垃圾收集被引入的时候,激活并发垃圾收集的命令选项是: -XX:+UseParallelGC 增强的并行收集和Java 6一起发布,通过一个新的命令行选项: -XX:+UseParallelOl ...
- HDFS源码分析之UnderReplicatedBlocks(二)
UnderReplicatedBlocks还提供了一个数据块迭代器BlockIterator,用于遍历其中的数据块.它是UnderReplicatedBlocks的内部类,有三个成员变量,如下: // ...
- 【转载】【selenium+Python WebDriver】之元素定位
总结: 感谢: “煜妃”<Selenuim+Python之元素定位总结及实例说明> “Huilaojia123”<selenium WebDriver定位元素学习总结> “上海 ...
- 【Python】selenium调用IE11浏览器,报错“找不到元素”NoSuchWindowException: Message:Unable to find element on closed window
当编写自动化脚本,定位浏览器元素时,报如下错误: 代码: >>> # coding=utf-8 >>> from selenium import webdriver ...
- springcloud和kubernetes对比
由于这两个都不熟,所以在考虑学哪个. 先说结论:都要学,但是重点学k8s,k8s是一个更加完善的解决方案,springcloud被淘汰只是时间的问题. 从自己的经历和网上的文章两方面分析 个人经历: ...
- EasyPlayerPro Windows播放器读取xml配置文件中的特殊字符问题
问题被反馈 今日一客户反馈说播放不了带用户名密码的流, 奇怪,这个问题不存在啊-,按照客户的说法, 是将url地址保存在配置文件中,然后再打开EasyPlayerPro运行: 问题复现 在EasyPl ...
- .NET Winform 将引用的dll文件集成到exe中(转)
Winform程序经常需要引用一些第三方dll文件,这些dll在发布后与exe文件保存在同一目录下,虽然将dll文件集成到exe中会增大文件尺寸,但程序目录会相对整洁. 下面介绍一种比较简单的集成方法 ...
- opencv常用类总结
1 Rect_ (const Point_< _Tp > &pt1, const Point_< _Tp > &pt2),Rect的这种两个点的构造函数的两个点 ...