http://poj.org/problem?id=3155

最大密度子图和最大权闭合图性质很相近(大概可以这么说吧),一个是取最多的边一个是取最多有正贡献的点,而且都是有选一种必须选另一种的限制,一个是选边必须选其两边的点,一个是选正权点必须选其相邻的负权点。

那么就可以把最大密度子图用最大权闭合图相近的方式写,二分+网络流就可以了,网络流建图方法可以参考我上一篇博客。

https://blog.csdn.net/power721/article/details/6781518 也就是该博客的第一种做法,不写第二种因为我懒,over。

顺便我的写法设置的精度单位(随便叫了个名字,领会精神)是1.0/n/n,有自环的话有点不靠谱,1e-4什么的可能逻辑上更合理一点。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
using namespace std;
#define LL long long
const int maxn=;
const double minf=1e14;
const double eps=1.0/1e16;
int n,m,s,t;
LL val[maxn]={};
int a[maxn][]={};
struct nod{
int y,next;double v;
}e[maxn*]; int head[maxn],tot=;
queue<int>q; int dep[maxn]={};
int zz[maxn]={},tly=,vis[maxn]={};
inline void init(int x,int y,double v){
e[++tot].y=y;e[tot].v=v;e[tot].next=head[x];head[x]=tot;
}
bool dfs(){
memset(dep,,sizeof(dep));
q.push(s);dep[s]=;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next){
if(e[i].v>eps&&!dep[e[i].y]){
dep[e[i].y]=dep[x]+;
q.push(e[i].y);
}
}
}
return dep[t];
}
double dfs1(int x,double fc){
if(x==t){
return fc;
}
double he=,z;
for(int i=head[x];i;i=e[i].next){
if(dep[x]+==dep[e[i].y]){
z=dfs1(e[i].y,min(fc-he,e[i].v));
he+=z;e[i].v-=z;e[i^].v+=z;
if(fc-he<eps)break;
}
}
return he;
}
bool check(double v){
memset(head,,sizeof(head));tot=;
for(int i=;i<=m;i++){
init(n+i,a[i][],minf);init(a[i][],n+i,);
init(n+i,a[i][],minf);init(a[i][],n+i,);
init(s,n+i,1.0);init(n+i,s,);
}
for(int i=;i<=n;i++){init(i,t,v);init(t,i,);}
while(dfs())dfs1(s,minf);
for(int i=;i<=m;i++){
int z=(i-)*++;
if(e[z].v>eps){
return ;
}
}
return ;
}
void dfs2(int x){
if(x==t)return;
if(x<=n)zz[++tly]=x;
vis[x]=;
for(int i=head[x];i;i=e[i].next){
if(vis[e[i].y]||e[i].v<eps)continue;
dfs2(e[i].y);
}
}
int main(){
scanf("%d%d",&n,&m);s=n+m+;t=s+;
if(n==){ printf("0\n");return ; }
if(m==){ printf("1\n1\n");return ; }
for(int i=;i<=m;i++){scanf("%d%d",&a[i][],&a[i][]);}
double l=0.5,r=m,mid;r=max(r,1.0);
double mi=1.0/(double)n/(double)n;
while(r-l>mi){
mid=(l+r)/;
if(check(mid))l=mid;
else r=mid;
}
check(l-mi);
dfs2(s);
printf("%d\n",tly);sort(zz+,zz++tly);
for(int i=;i<=tly;i++)printf("%d\n",zz[i]);
return ;
}

POJ 3155 Hard Life 最大密度子图 最大权闭合图 网络流 二分的更多相关文章

  1. POJ 2987 Firing(最大流最小割の最大权闭合图)

    Description You’ve finally got mad at “the world’s most stupid” employees of yours and decided to do ...

  2. BZOJ 4873 寿司餐厅(最大权闭合图 网络流)

    寿司餐厅 时间限制: 1 Sec  内存限制: 512 MB提交: 6  解决: 3[提交][状态][讨论版] 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序 ...

  3. poj 2987 Firing 最大权闭合图

    题目链接:http://poj.org/problem?id=2987 You’ve finally got mad at “the world’s most stupid” employees of ...

  4. POJ 2987 Firing 网络流 最大权闭合图

    http://poj.org/problem?id=2987 https://blog.csdn.net/u014686462/article/details/48533253 给一个闭合图,要求输出 ...

  5. poj 2987(最大权闭合图+割边最少)

    题目链接:http://poj.org/problem?id=2987 思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益:从每个负收益点向汇点t连边,容量为收益的相反数:对于i是 ...

  6. POJ 2987 Firing(最大权闭合图)

    [题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...

  7. POJ 2987:Firing(最大权闭合图)

    http://poj.org/problem?id=2987 题意:有公司要裁员,每裁一个人可以得到收益(有正有负),而且如果裁掉的这个人有党羽的话,必须将这个人的所有党羽都裁除,问最少的裁员人数是多 ...

  8. poj 2987 最大权闭合图

    Language: Default Firing Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 8744   Accept ...

  9. POJ 2987 Firing【最大权闭合图-最小割】

    题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ...

随机推荐

  1. Computer Vision Resources

    Computer Vision Resources Softwares Topic Resources References Feature Extraction SIFT [1] [Demo pro ...

  2. SDL封装的系统操作(转载)

    Andrew Haung bluedrum@163.com SDL封装很多操作系统的功能,为了保证SDL程序可移植性,最好尽量用这一些封装函数,哪果没有的话,才使用各种操作本地函数.  对于如何封各个 ...

  3. zookeeper zkClient api 使用

    操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...

  4. 移动端测试=== adb 无线连接手机

    无线连接(需要借助 USB 线) 除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 ...

  5. kernel 3.10内核源码分析--TLB相关--TLB概念、flush、TLB lazy模式 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4808877&uid=14528823 一.概念及基本原理 TLB ...

  6. docker stack 部署 redis

    =============================================== 2019/4/16_第2次修改                       ccb_warlock 更新 ...

  7. Windows 10安装MongoDB(安装&启动)

    Windows 10家庭中文版,MongoDB 3.6.3, 最近在学习Scrapy,可以却从未将scraped data存储到数据库中.在看过一些文档后,Scrapy会和MongoDB结合使用(还有 ...

  8. ibm x3550m4 开启cpu高性能模式

    1.必须进bios里调整,和调整超线程一样,重启服务器按F1进bios界面,选择system settings 2.选择最大性能模式:Operating Modes>Choose Operati ...

  9. UE简单配置

    1 头上显示文件位置和名称,视图->视图列表——>打开文件标签,在右面点放大 2 函数列表,视图->视图列表——>打开文件标签

  10. VS Code折腾记 - (3) 多图解VSCode基础功能

    前言 想了想,对于一个刚接触VSCODE的人来说,有什么比图片更通俗易懂的呢? 启动界面 : 快捷键(Ctrl + Shift + E) Search && replace : 快捷键 ...