文章目录

  • 题目描述
  • 解析
  • 代码

网络流要大胆建图

题目描述

公司内部共nnn个员工,员工之间可能有矛盾。若员工uuu和员工vvv有矛盾,用边(u,v)(u,v)(u,v)表示,共mmm个矛盾。

现在公司决定裁员,使得被裁人员间的矛盾指数最高。矛盾指数定义为被裁人员间的矛盾总数与被裁人员数的比值

解析

感觉很神仙的题
一开始自己的思路是暴力枚举裁员人数求最大矛盾,但是如何强制控制裁员人数把我卡住了…(费用流或许能做?)
最后还是看了题解qwq
关键是建图的方法
把每个职员和每条矛盾关系都看作一个点,那么(u,v)(u,v)(u,v)可以选取的前提就是uuu和vvv都选取
这样又成了求最大权闭合图的经典问题

但是如何确定点权呢?
考虑二分矛盾指数g,考虑是否存在一种方案,使得:
边数/点数>=g边数/点数>=g边数/点数>=g
移项,得:
边数∗1+点数∗(−g)>=0边数*1+点数*(-g)>=0边数∗1+点数∗(−g)>=0
这样就可以直接上dinic求了

代码

#include<bits/stdc++.h>
#define ll double
using namespace std;
const int N=5050;
const int M=1e9;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m,s,t;
struct node{int to,nxt;ll cap;
}p[300500];
int fi[N],cnt;
void addline(int x,int y,ll cap){p[++cnt]=(node){y,fi[x],cap};fi[x]=cnt;p[++cnt]=(node){x,fi[y],0};fi[y]=cnt;
}
int col[N],cur[N];
queue<int>q;
int bfs(){memset(col,0,sizeof(col));col[s]=1;q.push(s);while(!q.empty()){int now=q.front();q.pop();for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(col[to]||!p[i].cap) continue;col[to]=col[now]+1;q.push(to);}}return col[t];
}
ll dfs(int x,ll lim){if(x==t||!lim) return lim;ll res=0;for(int &i=cur[x];~i;i=p[i].nxt){int to=p[i].to;if(!p[i].cap||col[to]!=col[x]+1) continue;ll add=dfs(to,min(lim,p[i].cap));lim-=add;res+=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;}if(lim) col[x]=-1;return res;
}
ll dinic(){ll res=0;while(bfs()){while(ll tmp=dfs(s,2e15)) res+=tmp;}return res;
}
int vis[N];
void find1(int x){if(vis[x]) return;vis[x]=1;for(int i=fi[x];~i;i=p[i].nxt){if(!p[i].cap) continue;find1(p[i].to);}return;
}
void find2(int x){if(vis[x]) return;vis[x]=2;for(int i=fi[x];~i;i=p[i].nxt){if(!p[i^1].cap) continue;find2(p[i].to);}return;
}
int num;
int u[N],v[N];
bool check(double x){memset(fi,-1,sizeof(fi));cnt=-1;double tot=m;s=n+m+1;t=n+m+2;for(int i=1;i<=n;i++){addline(i,t,x);}for(int i=1;i<=m;i++){addline(s,i+n,1);addline(i+n,u[i],2e15);addline(i+n,v[i],2e15);}return tot-dinic()>0;
}
int main(){n=read();m=read();if(!m){printf("1\n1");return 0;}for(int i=1;i<=m;i++){u[i]=read();v[i]=read();}double st=0,ed=2e9;for(int i=1;i<=100;i++){double mid=(st+ed)/2;if(check(mid)) st=mid;else ed=mid;}check(st);find1(s);int num=0;for(int i=1;i<=n;i++){num+=vis[i]?1:0;}printf("%d\n",num);for(int i=1;i<=n;i++){if(vis[i]) printf("%d\n",i);}return 0;
}
/*
3 2 1 3
1 2 10
2 3 10
*/

YBTOJ:矛盾指数(网络流-最大权闭合图)相关推荐

  1. jzoj5057-[GDSOI2017模拟4.13]炮塔【网络流,最大权闭合图】

    正题 题面链接:https://gmoj.net/senior/#main/show/5057 题目大意 n∗mn*mn∗m的网格上有一些炮和敌军,每个炮可以攻击在它方向上一个敌军,但是要求炮弹的轨迹 ...

  2. P2805-[NOI2009]植物大战僵尸【网络流,最大权闭合图】

    正题 题目链接:https://www.luogu.com.cn/problem/P2805 题目大意 n∗mn*mn∗m的格子,攻击这个格子(x,y)(x,y)(x,y)可以获得价值cx,yc_{x ...

  3. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1105  Solved: 331 [Submit][Sta ...

  4. p2762-太空飞行计划问题【网络流,最大权闭合图,最小割】

    正题 AC评测记录链接: https://www.luogu.org/record/show?rid=7965757 大意 有nnn个实验,有m" role="presentati ...

  5. 【POJ - 2987】Firing(最大权闭合图,网络流最小割,输出方案最小,放大权值法tricks)

    题干: You've finally got mad at "the world's most stupid" employees of yours and decided to ...

  6. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

    #6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

  7. 太空飞行计划LibreOJ - 6001(网络流24题)(最大权闭合图)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合  ,和进行这些实验需要使用的全部仪器的集合 .实验  需要用到 ...

  8. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

  9. 51nod1551-集合交易【hall定理,最大权闭合图,网络流】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1551 题目大意 nnn个集合,nnn个物品,每个集合有一些物品,一个价钱 ...

最新文章

  1. jq 切换功能toggle
  2. CommonJS,AMD,CMD区别 - 郑星阳 - ITeye博客
  3. android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
  4. 树莓派4b装系统_树莓派4B初次使用--系统安装|配置
  5. IDEA:生成javadoc/断点调试/缓存和索引的清理
  6. CSS基础「七」精灵图 \ 字体图标 \ 三角 \ 用户界面样式 \ 页面初始化
  7. 批处理等待上一条完成再执行下面的_分布式批处理实现方案
  8. java web js_JAVA Web JS
  9. python 英文语义分析_python语意分析
  10. 关键词组合工具-免费在线关键词标题组合工具
  11. android 带刻度的滑动条_Android实现滚动刻度尺效果
  12. 【2021软件测试扫盲】测试理论(325页“面试教科书”免费送)
  13. android手机不开机刷机,手机无法开机怎么刷机?安卓手机救砖教程
  14. UVM—virtual sequencer and virtual sequence详解
  15. 数据分析常用名称、统计分析模型 SUS、CLV、VOC、认知失调、 体验度量
  16. webrtc中的带宽自适应算法
  17. Cesium geojson数据的添加与移除
  18. 又发现一个ChatGPT国内镜像站
  19. 车辆换道决策的模糊控制算法实例
  20. sklearn与scikit-learn不是一回事,正确的sklearn安装方式,不报错!

热门文章

  1. python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量
  2. opentrace在mysql中使用_采用OpenReplicator解析MySQL binlog
  3. java proguard 使用_一步步教你使用Proguard混淆Java源代码
  4. ansys fluent udf manual 下载_FLUENT流固耦合柱体结构涡激振动仿真案例解析
  5. leetcode459. 重复的子字符串(KMP)
  6. vector的逆序输出(神奇的vector)
  7. 递归算法(一)递归概念与思路
  8. 下一个更大元素 leetcode-496
  9. 2019-03-09-算法-进化(买卖股票的最佳时机 II)
  10. lintcode 有效的括号序列