POJ 3155 Hard Life 最大密度子图 最大权闭合图 网络流 二分
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 最大密度子图 最大权闭合图 网络流 二分的更多相关文章
- POJ 2987 Firing(最大流最小割の最大权闭合图)
Description You’ve finally got mad at “the world’s most stupid” employees of yours and decided to do ...
- BZOJ 4873 寿司餐厅(最大权闭合图 网络流)
寿司餐厅 时间限制: 1 Sec 内存限制: 512 MB提交: 6 解决: 3[提交][状态][讨论版] 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序 ...
- poj 2987 Firing 最大权闭合图
题目链接:http://poj.org/problem?id=2987 You’ve finally got mad at “the world’s most stupid” employees of ...
- POJ 2987 Firing 网络流 最大权闭合图
http://poj.org/problem?id=2987 https://blog.csdn.net/u014686462/article/details/48533253 给一个闭合图,要求输出 ...
- poj 2987(最大权闭合图+割边最少)
题目链接:http://poj.org/problem?id=2987 思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益:从每个负收益点向汇点t连边,容量为收益的相反数:对于i是 ...
- POJ 2987 Firing(最大权闭合图)
[题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...
- POJ 2987:Firing(最大权闭合图)
http://poj.org/problem?id=2987 题意:有公司要裁员,每裁一个人可以得到收益(有正有负),而且如果裁掉的这个人有党羽的话,必须将这个人的所有党羽都裁除,问最少的裁员人数是多 ...
- poj 2987 最大权闭合图
Language: Default Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 8744 Accept ...
- POJ 2987 Firing【最大权闭合图-最小割】
题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ...
随机推荐
- java 面试算法题
/** * 设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从 * 出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为 * 止.设n个人的编号分别为1,2,… ...
- 渗透测试===使用BURPSUIT暴力破解某网站的手机验证码
手机短信验证是企业给消费者(用户)的一个凭证,通过手机短信内容的验证码来验证身份.主要用来用户注册,找回密码,用户登录等等作为强身份认证. 目前验证码的格式主要是数字,从4位到6位不等.一般来说验 ...
- C# 调用WSDL接口及方法
1.首先需要清楚WSDL的引用地址 如:http://XX.XX.4.146:8089/axis/services/getfileno?wsdl 上述地址的构造为 类名getfileno. 2.在.N ...
- qt使用动态库(DLL)
本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL.至于其它情况本文不作讨论. 连接库分为2种 (1)动态连接库,通常有.h .lib .dll三个文件,功能实现在dll中 ( ...
- 决策树和adaboost
前面:好老的东西啊,啊啊啊啊啊啊啊啊啊 来源于统计学习方法: 信息增益: 其中 信息增益率: 基尼指数: 取gini最小的 先剪枝——在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造. 后 ...
- 详解MySQL大表优化方案
单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时 ...
- Unix IPC之互斥锁与条件变量
互斥锁 1.函数声明 #include <pthread.h> /* Mutex handling. */ /* Initialize a mutex. */ extern int pth ...
- CVE-2012-0158基于exp分析
CVE-2012-0158这个洞我之前分析过,漏洞战争这本书里也写过,但是都是用poc分析的,我这次找了一个弹计算器的exp来分析,感觉用poc和用exp还是不一样的,从exp分析要比从poc分析更复 ...
- NopCommerce Plugins 不能智能提示的解决方法(MVC 5 & RAZOR 3.0)
分享给需要的朋友: http://mhammadchehab.com/wordpress/2013/12/enabling-intellisense-for-razor-in-class-librar ...
- 毕设demo写好
2015年1月20日 14:41:47 阶段性暂停!! 把运行结果截图给了老师,老师说先整理下文档,然后下学期来了再部署到服务器上. 那么,下学期来了,估计也要把Epm和CR1000什么的搞好了. 先 ...