点边都带权的最大密度子图,且会有必须选的点.

求\(\frac{\sum w_e}{k*(2n-k)}\)的最大值,其中k为子图点数

设$$h(g) = \sum w_e - g*(2nk-k^2)$$

假设最优解为\(g*\),则当\(g<g*\)时,\(h(g)>0\);\(g>g*时,h(g)<0\),以此判断条件二分搜索.

但是\((2nk-k^2)\)不能直接转化为点权,需要做点改变.

\[\sum w_e - g*2nk+g*k^2 = \sum w_e + \frac{k(k-1)}{2}*2g+kg-2kng
\]

\[= \sum (w_e + 2g) - (2ng-g)*k
\]

这个式子的意义等于对原图的每一条边都加上了边权2g,若原图两点间没有边,则新建一条权值为2g的边. 每个点的点权为\((2ng-g)\)

这样就转化成了点边均带权的最大密度子图模型.

还有一些必须要选的点.因为在最大权闭合子图的模型中,若源点S与点i之间的边不是割,则表示没有选择这个点.根据这个性质,我们在建图的时候对必须选的点,只从源点S向它建边,容量为正无穷,保证它不会成为割中的边.然后在总的流量中加上这个点的点权.

第二十组数据特别卡精度,但是eps设得过高会T.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const double eps = 1e-7;
  4. const int INF = 0x3f3f3f3f;
  5. const int MAXN= 405;//点数的最大值
  6. const int MAXM= 1e6 + 10;//边数的最大值
  7. #define captype double
  8. struct Edge{
  9. int from,to,next;
  10. captype cap;
  11. };
  12. struct SAP_MaxFlow{
  13. Edge edges[MAXM];
  14. int tot,head[MAXN];
  15. int gap[MAXN];
  16. int dis[MAXN];
  17. int cur[MAXN];
  18. int pre[MAXN];
  19. void init(){
  20. tot=0;
  21. memset(head,-1,sizeof(head));
  22. }
  23. void AddEdge(int u,int v,captype c,captype rc=0){
  24. edges[tot] = (Edge){u,v,head[u],c}; head[u]=tot++;
  25. edges[tot] = (Edge){v,u,head[v],rc}; head[v]=tot++;
  26. }
  27. captype maxFlow_sap(int sNode,int eNode, int n){//n是包括源点和汇点的总点个数,这个一定要注意
  28. memset(gap,0,sizeof(gap));
  29. memset(dis,0,sizeof(dis));
  30. memcpy(cur,head,sizeof(head));
  31. pre[sNode] = -1;
  32. gap[0]=n;
  33. captype ans=0;
  34. int u=sNode;
  35. while(dis[sNode]<n){
  36. if(u==eNode){
  37. captype Min=INF ;
  38. int inser;
  39. for(int i=pre[u]; i!=-1; i=pre[edges[i^1].to])
  40. if(Min>edges[i].cap){
  41. Min=edges[i].cap;
  42. inser=i;
  43. }
  44. for(int i=pre[u]; i!=-1; i=pre[edges[i^1].to]){
  45. edges[i].cap-=Min;
  46. edges[i^1].cap+=Min;
  47. }
  48. ans+=Min;
  49. u=edges[inser^1].to;
  50. continue;
  51. }
  52. bool flag = false;
  53. int v;
  54. for(int i=cur[u]; i!=-1; i=edges[i].next){
  55. v=edges[i].to;
  56. if(edges[i].cap>0 && dis[u]==dis[v]+1){
  57. flag=true;
  58. cur[u]=pre[v]=i;
  59. break;
  60. }
  61. }
  62. if(flag){
  63. u=v;
  64. continue;
  65. }
  66. int Mind= n;
  67. for(int i=head[u]; i!=-1; i=edges[i].next)
  68. if(edges[i].cap>0 && Mind>dis[edges[i].to]){
  69. Mind=dis[edges[i].to];
  70. cur[u]=i;
  71. }
  72. gap[dis[u]]--;
  73. if(gap[dis[u]]==0) return ans;
  74. dis[u]=Mind+1;
  75. gap[dis[u]]++;
  76. if(u!=sNode) u=edges[pre[u]^1].to; //退一条边
  77. }
  78. return ans;
  79. }
  80. }F;
  81. int N, M ;
  82. double d[MAXN];
  83. int tag[MAXN];
  84. int G[405][405];
  85. #define U (400 * 2100)
  86. bool check(double g)
  87. {
  88. int s = 0, t = N+1;
  89. F.init();
  90. double flow = 0;
  91. for(int i=1;i<=N;++i){
  92. d[i] = 0.0;
  93. for(int j=1;j<=N;++j){
  94. if(i==j) continue;
  95. d[i] += 2*g + G[i][j];
  96. F.AddEdge(i,j,G[i][j] + 2*g);
  97. }
  98. }
  99. for(int i=1;i<=N;++i){
  100. if(tag[i]){
  101. flow += U + 2*g*(2*N-1) - d[i];
  102. F.AddEdge(s, i, INF);
  103. }
  104. else{
  105. F.AddEdge(s,i,U);
  106. F.AddEdge(i,t, U + 2 * g * (2*N - 1) - d[i]);
  107. }
  108. }
  109. double hg = (U*N - flow - F.maxFlow_sap(s,t,t+1)) * 0.5;
  110. return hg > eps;
  111. }
  112. int main()
  113. {
  114. #ifndef ONLINE_JUDGE
  115. freopen("in.txt", "r", stdin);
  116. freopen("out.txt", "w", stdout);
  117. #endif
  118. int u,v,w;
  119. scanf("%d %d",&N, &M);
  120. for(int i=1;i<=M;++i){
  121. scanf("%d %d %d",&u, &v, &w);
  122. G[u][v] = G[v][u] = w;
  123. }
  124. for(int i=1;i<=N;++i){
  125. scanf("%d",&tag[i]);
  126. }
  127. double L = 0, R = 200, mid;
  128. while(R - L >= eps){
  129. mid = (L+R) * 0.5;
  130. if(check(mid)) L = mid;
  131. else R = mid;
  132. }
  133. printf("%.6f\n",(L+R)*0.5);
  134. return 0;
  135. }

2017 计蒜之道 初赛 第三场 D. 腾讯狼人杀 (点边都带权的最大密度子图)的更多相关文章

  1. 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树

    腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...

  2. 2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...

  3. 2017 计蒜之道 初赛 第五场 D. UCloud 的安全秘钥(困难)

    小数据打表,大数据暴力. 导致超时的主要原因是$m$小的询问次数太多,可以把$m≤10$的答案直接暴力打表存起来,$m>10$的用$C$题的方法即可. #include <iostream ...

  4. 2017 计蒜之道 初赛 第五场 C. UCloud 的安全秘钥(中等)

    暴力. $O(m*n)$的算法可以通过此题,每次询问$O(m)$扫$S$数组,统计不同数字的个数,每次移动最多只会变化两个数字,如果不同数字个数为$0$,那么答案加$1$. #include < ...

  5. 2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)

    暴力. 暴力枚举$S$串的每一个长度为$m$的子串,排序判断即可. #include <iostream> #include <cstdio> #include <cst ...

  6. 2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建

    贪心. 从大到小排序之后进行模拟,注意$n=1$和$n=0$的情况. #include <iostream> #include <cstdio> #include <cs ...

  7. 2017 计蒜之道 初赛 第一场 A、B题

    A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏——成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋 ...

  8. 2017 计蒜之道 初赛 第一场 A 阿里的新游戏

    题链:https://nanti.jisuanke.com/t/15499 这题观察图纸可知成三线段上的相邻点之间的距离有1,2,3三种情况的,同时要成线段必然是同横坐标或者纵坐标,然后我们排除掉穿过 ...

  9. 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)

    题链:"https://nanti.jisuanke.com/t/15500" 本来希望通过找循环节然后套KMP来通过后面题的,可是只过了B题,可能循环节不一定是存在的. #inc ...

随机推荐

  1. RF中空列表变量不能直接赋至为[]

    RF中空列表正确定义方法为:

  2. 《从零开始学Swift》学习笔记(Day 70)——Swift与Objective-C混合编程之Swift与Objective-C API映射

    原创文章,欢迎转载.转载请注明:关东升的博客 Swift与Objective-C API映射 在混合编程过程中Swift与Objective-C调用是双向的,由于不同语言对于相同API的表述是不同的, ...

  3. 一些VS2013的使用技巧(转载)

    1. Peek View 可以在不新建TAB的情况下快速查看.编辑一个函数的代码. 用法:在光标移至某个函数下,按下alt+F12. 然后在Peek窗口里可以继续按alt+F12.然后按ctrl+al ...

  4. eslint常规语法检

    "no-alert": 0,//禁止使用alert confirm prompt "no-array-constructor": 2,//禁止使用数组构造器 & ...

  5. 解决<pre>标签里的文本换行(兼容IE, FF和Opera等)

      我们都知道<pre> 标签可定义预格式化的文本,一个常见应用就是用来表示计算机的源代码.被包围在 pre 元素中的文本通常会保留空格和换行符,但不幸的是,当你在<pre>标 ...

  6. Delphi开发的服务在Windows2003 64位注册方式。

    1.在sysWoW32目录下找到cmd.exe,右键运行方式选择administrator,输入密码后.2.TrainServer.exe -install  安装服务.

  7. snappy性能测试之安装运行

    项目地址:https://code.google.com/p/snappy/ 下载后,解压. $./configure $make 建立一个简单的测试文件a.cpp: #include "s ...

  8. android系统权限SET_PREFERRED_APPLICATIONS怎么获取

    最近自己写个demo,需要用到SET_PREFERRED_APPLICATIONS权限 在网上找了半天,大概有两种方式: 1. 将手机root后,把apk强行push到system/app目录下,重启 ...

  9. 监控之snmpd 服务

    监控离不开数据采集,经常使用的Mrtg ,Cacti,Zabbix,等等监控软件都是通过snmp 协议进行数据采集的! 1 什么是snmp 协议? 简单网络管理协议(SNMP,Simple Netwo ...

  10. B. Mike and Fun---cf548B(暴力求解)

    题目链接:http://codeforces.com/problemset/problem/548/B 有一个n*m的矩阵,里面只有0和1,现在有Q个改变,每次都把(x,y)这点变为相反的点(0变1, ...