我真菜啊←地址

求最大密度子图方案。密度=边数/点数


假设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[二分答案+最小割]的更多相关文章

  1. 【BZOJ2756】奇怪的游戏(二分,最小割)

    题意: Blinker最近喜欢上一个奇怪的游戏.这个游戏在一个 N*M 的棋盘上玩,每个格子有一个数.每次 Blinker 会选择两个相邻的格子,并使这两个数都加上 1.现在 Blinker 想知道最 ...

  2. 第十四届华中科技大学程序设计竞赛 K Walking in the Forest【二分答案/最小化最大值】

    链接:https://www.nowcoder.com/acm/contest/106/K 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

  3. 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 ...

  4. 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型

    最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那 ...

  5. 【分块答案】【最小割】bzoj1532 [POI2005]Kos-Dicing

    引用zky的题解:http://blog.csdn.net/iamzky/article/details/39667859 每条S-T路径代表一次比赛的结果.最小割会尽量让一个人赢得最多. 因为二分总 ...

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

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

  7. 最大密集子图(01分数规划+二分+最小割)POJ3155

    题意:给出一副连通图,求出一个子图令g=sigma(E)/sigma(V); h[g]=sigma(E)-g*sigma(V):设G是最优值 则当h[g]>0:g<G h[g]<0, ...

  8. BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )

    二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...

  9. [HNOI2009]最小圈 (二分答案+负环)

    题面:[HNOI2009]最小圈 题目描述: 考虑带权的有向图\(G=(V,E)\)以及\(w:E\rightarrow R\),每条边\(e=(i,j)(i\neq j,i\in V,j\in V) ...

随机推荐

  1. python os模块 常用函数

    os.getcwd() 获取当前工作目录 os.listdir() 返回指定目录下的所有文件和目录 os.remove() 删除单个文件 os.path.split() 以元祖形式返回一个路径的目录和 ...

  2. 最新精品 强势来袭 XP,32/64位Win7,32/64位Win10系统【电脑城版】

    随着Windows 10Build 10074 Insider Preview版发布,有理由相信,Win10离最终RTM阶段已经不远了.看来稍早前传闻的合作伙伴透露微软将在7月底正式发布Win10的消 ...

  3. Java&amp;Xml教程(十)XML作为属性文件使用

    我们一般会将Java应用的配置參数保存在属性文件里.Java应用的属性文件能够是一个正常的基于key-value对,以properties为扩展名的文件.也能够是XML文件. 在本案例中.將会向大家介 ...

  4. 限制UITextView的字数和字数监控,表情异常的情况和禁用表情

    限制UITextView的字数和字数监控,表情异常的情况和禁用表情   3523FD80CC4350DE0AE7F89A8532B9A8.png 因为字数占一个字符,表情占两个字符.你要是限制15个字 ...

  5. JSON格式之GSON解析

    JSON格式之GSON解析 最近在做websocket相关,项目需要JSON解析.相较之下感觉google的GSON解析不错. JAVA后台 Gson提供了fromJson()方法来实现从Json相关 ...

  6. android菜鸟学习笔记6----android布局(一)

    Android应用的UI组件都是继承自View类,View类表示的就是一个空白的矩形区域.常用的组件如TextView.Button.EditText等都直接或间接继承自View. 此外,View还有 ...

  7. ArcGIS api for javascript 离线部署

    一.说明: 1.本篇文章以及之后的相关的文章所使用的ArcGIS API for javascript 的版本是3.3.初学者为了学习简单,可以引用在线的 Javascript.但是如果只能连接内网, ...

  8. Mac root Operation not permitted

      在mac下sudo 拷贝和删除文件时提醒Operation not permitted. 网上查了一些资料,需要执行 chflags nouchg /path/to/item 命令. 赶紧照做, ...

  9. 改善程序与设计的55个具体做法 day1

    博客好久没更新了,就从这本读书笔记开始吧. 条款01: 视C++为一个语言联邦 C++可视为有四个次语言组成的: 1.C语言 2.Object-Oriented C++ (面向对象C++) 3.Tem ...

  10. Win8+VS2012 配置OpenGL SuperBible5 环境

    (1)glew: 版本:1.7.0-win32 下载地址:https://sourceforge.net/projects/glew/files/glew/ 安装步骤: 将include文件夹下的.h ...