题目

\(n\) 个点,\(m\) 条边的一个无向图,问导出子图的边数除以点数的最大值


分析

考虑二分这个答案,也就是0/1分数规划之后转换成 \(E-mid*V>0\)

这个问题虽然可以精确到具体的最小割,但是也可以泛化到一般的问题。

可以发现转换成最大权闭合子图,源点连边,汇点连点,边和点之间连 \(inf\)。

然后最后就是在残余网络上记录哪些点可以被访问,就是导出子图的点。

所以最大密度子图的问题都可以转化成最大权闭合子图吧。


代码

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. const int N=1111; typedef double db;
  5. struct node{int y; db w; int next;}e[N<<3];
  6. int dis[N],as[N],et=1,X[N],tot,Y[N],v[N],mark[N],b[N],n,m,S,T;
  7. void add(int x,int y,db w){
  8. e[++et]=(node){y,w,as[x]},as[x]=et;
  9. e[++et]=(node){x,0,as[y]},as[y]=et;
  10. }
  11. bool bfs(int st){
  12. for (int i=1;i<=T;++i) dis[i]=0;
  13. queue<int>q; q.push(st),dis[st]=1;
  14. while (!q.empty()){
  15. int x=q.front(); q.pop();
  16. for (int i=as[x];i;i=e[i].next)
  17. if (e[i].w>0&&!dis[e[i].y]){
  18. dis[e[i].y]=dis[x]+1;
  19. if (e[i].y==T) return 1;
  20. q.push(e[i].y);
  21. }
  22. }
  23. return 0;
  24. }
  25. db min(db a,db b){return a<b?a:b;}
  26. db dfs(int x,db now){
  27. if (x==T||!now) return now;
  28. db rest=0,f;
  29. for (int i=as[x];i;i=e[i].next)
  30. if (e[i].w>0&&dis[e[i].y]==dis[x]+1){
  31. f=dfs(e[i].y,min(now-rest,e[i].w)),
  32. rest+=f,e[i].w-=f,e[i^1].w+=f;
  33. if (now==rest) return now;
  34. }
  35. if (!rest) dis[x]=0;
  36. return rest;
  37. }
  38. bool check(db mid){
  39. for (int i=2;i<=et;i+=2) e[i].w+=e[i^1].w,e[i^1].w=0;
  40. for (int i=1;i<=n;++i) e[mark[i]].w=mid;
  41. db ans=m;
  42. while (bfs(S)) ans-=dfs(S,1e9);
  43. return ans>1e-8;
  44. }
  45. void Dfs(int x){
  46. v[x]=1;
  47. for (int i=as[x];i;i=e[i].next)
  48. if (!v[e[i].y]&&e[i].w) Dfs(e[i].y);
  49. }
  50. int main(){
  51. ios::sync_with_stdio(0);
  52. while (cin>>n>>m){
  53. if (!m) {cout<<"1\n1\n\n"; continue;}
  54. for (int i=1;i<=m;++i) cin>>X[i]>>Y[i];
  55. S=n+m+1,T=S+1,et=1;
  56. for (int i=1;i<=m;++i) add(S,i+n,1);
  57. for (int i=1;i<=n;++i) add(i,T,0),mark[i]=et-1;
  58. for (int i=1;i<=m;++i) add(i+n,X[i],1e9),add(i+n,Y[i],1e9);
  59. db l=1.0/n,r=m,eps=1.0/(n*n);
  60. while (l+eps<r){
  61. db mid=(l+r)/2;
  62. if (check(mid)) l=mid;
  63. else r=mid;
  64. }
  65. check(l),Dfs(S),tot=0;
  66. for (int i=1;i<=n;++i) if (v[i]) b[++tot]=i;
  67. cout<<tot<<endl;
  68. for (int i=1;i<=tot;++i) cout<<b[i]<<endl;
  69. cout<<endl;
  70. for (int i=1;i<=T;++i) as[i]=v[i]=0;
  71. }
  72. return 0;
  73. }

#最大密度子图,0/1分数规划#UVA1389 Hard Life的更多相关文章

  1. poj 2976 Dropping tests 0/1分数规划

    0/1分数规划问题,用二分解决!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> # ...

  2. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  3. LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP+0/1分数规划

    题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...

  4. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  5. POJ - 2976 Dropping tests && 0/1 分数规划

    POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} ...

  6. [SDOI2017]新生舞会 0/1分数规划

    ---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...

  7. bzoj3232圈地游戏——0/1分数规划+差分建模+判环

    Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到 ...

  8. Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)

    题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...

  9. Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)

    题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...

  10. Luogu P1768 天路 0/1分数规划+dfs spfa

    “那是一条神奇的天路诶~~把第一个神犇送上天堂” 怕不是某大佬早就A了这题,然鹅我又调了很久很久... 好吧就是0/1分数规划,但是跑的dfs的spfa(好像题解说bfs过不了????不知) 发现把s ...

随机推荐

  1. Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按照输入点顺序连曲线

    需求   使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图.  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题.  实际预期效果为:  ...

  2. 硬件开发笔记(十二):RK3568底板电路电源模块和RTC模块原理图分析

    前言   做硬件做系统做驱动,很难从核心板做起,所以我们先依赖核心板,分析底板周围的电路,然后使用AD绘制原理图和设计PCB,打样我司测试底板,完成硬件测试,再继续系统适配,驱动移植,从而一步一步完善 ...

  3. RK3568开发笔记(九):开发板buildroot固件调通RS485口,运行项目中RS485协议调试工具Demo

    前言   上一篇已经将Qt移植过去了,此时我们移植整体应用不是什么问题了,那么现在应用对外得接口使用了RS485接口,板载了一个RS485,于是需要调通,兼容这个开发板得RS485.   补充   看 ...

  4. Navicat 12连接mysql8.x报错2059 - authentication plugin 'caching_sha2_password' 解决办法

    // %表示远程连接允许所有ip,如果只是连接本地,将%改为localhost即可 ALTER USER 'root'@'%' IDENTIFIED BY '你自己的mysql的密码' PASSWOR ...

  5. xadmin后台的安装及配置使用

    安装 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 在settings.py中注册如下应用 INSTALLED_ ...

  6. JAVA 考试管理系统 大作业(一):需求分析

    好家伙,有需要的拿去借鉴吧(虽然我也百度了很多) 题目如下: 题目四:考试管理系统 (选做要求:使用图形用户界面) 分3种用户角色:教务员(具有管理权限).教师.学生 l  教务员:可以进行用户管理( ...

  7. 用 nebula_dart_gdbc 在移动设备玩图数据库,泰酷辣!

    nebula_dart_gdbc,是访问 NebulaGraph 的 Dart 语言客户端,在 dart_gdbc 的规范下进行开发. dart_gdbc 是一套使用 Dart 语言定义的图数据库标准 ...

  8. 如何运维多集群数据库?58 同城 NebulaGraph Database 运维实践

    图计算业务背景介绍 我们为什么选择 NebulaGraph? 在公司各个业务线中,有不少部门都有着关系分析等图探索场景,随着业务发展,相关的需求越来越多.大量需求使用多模数据库来实现,开发成本和管理成 ...

  9. 数据库运维 | 携程分布式图数据库NebulaGraph运维治理实践

    作者简介:Patrick Yu,携程云原生研发专家,关注非关系型分布式数据存储及相关技术. 背景 随着互联网世界产生的数据越来越多,数据之间的联系越来越复杂层次越来越深,人们希望从这些纷乱复杂的数据中 ...

  10. Java interface 接口 新特性

    1 package com.bytezreo.interfacetest; 2 3 public class SubClass2 { 4 public static void main(String[ ...