Time limit 3000 ms


题目大意

(翻译来自洛谷)
John是某公司的CEO
公司内部共n个员工,员工之间可能曾经因为小事有了过节,总是闹矛盾。
若员工u和员工v有矛盾,用边(u,v)表示,共m个矛盾。
最近,该公司内部越来越不团结,John决定裁员。
他想得到一个被裁人员的清单,使得被裁人员间的不团结率最高。
不团结率定义为被裁人员间的矛盾总数与被裁人员数的比值(不团结率 = 被裁人员之间的矛盾总数 / 被裁人员数)


题目分析

看到这种比率的形式马上想到分数规划
即求原图的一个子图G′=(V′,E′)G^{'}=(V^{'},E^{'})G′=(V′,E′)使得∑e∈E′1∑v∈V′1\frac{\sum_{e\in E^{'}}1}{\sum_{v\in V^{'}}1}∑v∈V′​1∑e∈E′​1​最大化
那么按照分数规划的套路二分比值(设为g)
判断是否存在方案使得∑e∈E′1∑v∈V′1≥g⇒∑e∈E′1−∑v∈V′g≥0\frac{\sum_{e\in E^{'}}1}{\sum_{v\in V^{'}}1}\geq g \Rightarrow \sum_{e\in E^{'}}1-\sum_{v\in V^{'}}g\geq 0∑v∈V′​1∑e∈E′​1​≥g⇒∑e∈E′​1−∑v∈V′​g≥0成立

根据题意可知选择一条边则必定选择这条边的两个端点
那么上面这个式子恰好对应到了最大权闭合子图的模型

源点s向每对矛盾连边,容量为1
每个员工向汇点t连边,容量为g
每个矛盾向其对应的员工连边,容量为inf
判断最大收益(矛盾数m-最小割)是否大于等于0即可

被精度活活卡死

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long lt;
typedef double dd;
#define eps 1e-8int read()
{int x=0,f=1;char ss=getchar();while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}return x*f;
}const dd inf=1e9;
const int maxn=10010;
int n,m;
struct node{int v,nxt;dd f;}E[maxn<<2];
int head[maxn],tot=1;
int lev[maxn];
struct edge{int u,v;}edge[maxn];
int judge[110];
vector<int> rem;void add(int u,int v,dd f)
{E[++tot].nxt=head[u];E[tot].v=v; E[tot].f=f;head[u]=tot;E[++tot].nxt=head[v];E[tot].v=u; E[tot].f=0.0;head[v]=tot;
}int bfs(int s,int t)
{memset(lev,-1,sizeof(lev)); lev[s]=0;queue<int> q; q.push(s);while(!q.empty()){int u=q.front(); q.pop();for(int i=head[u];i;i=E[i].nxt){int v=E[i].v;if(lev[v]==-1&&E[i].f>0){lev[v]=lev[u]+1;if(v==t) return 1;q.push(v);}}}return 0;
}dd dfs(int u,dd cap,int t)
{if(u==t) return cap;dd flow=cap;for(int i=head[u];i;i=E[i].nxt){int v=E[i].v;if(lev[v]==lev[u]+1&&E[i].f>0&&flow>0){dd f=dfs(v,min(E[i].f,flow),t);E[i].f-=f; E[i^1].f+=f;flow-=f;}}return cap-flow;
}dd dicnic(int s,int t)
{dd maxf=0;while(bfs(s,t)) maxf+=dfs(s,inf,t);return maxf;
}int calc(dd x)
{memset(head,0,sizeof(head)); tot=1;   int s=n+m+1,t=s+1;for(int i=1;i<=m;++i){add(s,i,1.0);add(i,edge[i].u+m,inf);add(i,edge[i].v+m,inf);}for(int i=1;i<=n;++i)add(i+m,t,x);dd maxf=dicnic(s,t);return 1.0*m-maxf;
}int solve(dd rat)
{rem.clear();memset(judge,0,sizeof(judge));int s=n+m+1,t=s+1,res=0;calc(rat); bfs(s,t);for(int i=1;i<=m;++i)if(lev[i]!=-1) {if(++judge[edge[i].u]==1) res++;if(++judge[edge[i].v]==1) res++;}for(int i=1;i<=n;++i)if(judge[i]) rem.push_back(i);return res;
}int main()
{int cs=0;while(scanf("%d%d",&n,&m)!=EOF){if(cs++!=0) printf("\n");if(m==0){ printf("1\n1\n"); continue;}for(int i=1;i<=m;++i)edge[i].u=read(),edge[i].v=read();dd L=1.0/(dd)n,R=m*1.0,rat=0;while(R-L>eps){dd mid=(L+R)/2.0;if(calc(mid)>eps) rat=L=mid;else R=mid;}int ans=solve(rat);printf("%d\n",ans);for(int i=0;i<rem.size();++i)printf("%d\n",rem[i]);}return 0;
}

集训队论文–胡伯涛《最小割模型在信息学竞赛中的应用》里面还描述了一种进一步优化的方法
但蒟蒻还没完全理解,过段时间再补上

UVA - 1389 Hard Life【分数规划+最小割】【最大权闭合图】相关推荐

  1. HDU 3061 Battle(最小割----最大权闭合图)

    题意: Problem Description 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅.而他上任的第一天,就面对了一场极其困难的战斗: 据侦查兵回报,前方共有N座城池,考虑到地势原因, ...

  2. ZOJ - 2676 Network Wars(01分数规划+最小割)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边组成的无向带权图,现在需要求一个将点 1 和点 n 分开的割集 C ,使得 最小 题目分析:分数式为总权值比上边的数量,换句话说就是一条边只 ...

  3. bzoj 3232: 圈地游戏【分数规划+最小割】

    数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...

  4. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  5. 图论 —— 网络流 —— 最小割 —— 最大权闭合子图

    [概述] 给出一个有向图,每一个点都有一个权值,现在要选择一个权值和最大的子图,使得每个点的后继都在子图中,这个子图就称为最大权闭合子图. 如上图,能选的子图有:Ø.{1,2,3,4,5,6}.{3, ...

  6. zoj 1676Network Wars(胡博涛论文题,01分数规划+最小割)

    题目链接 Network Wars Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge Network of By ...

  7. luogu P3410 拍照(最大权闭合图转最小割)

    luogu P3410 拍照 最大权闭合图转最小割 要得到最大收益,我们可以用总可能收益减去最小花费,也就是最小割. #include<cstdio> #include<cstrin ...

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

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

  9. noi 2006 最大收益 最大权闭合图转最小割转最大流

    题意:一个公司有n个可以建造通讯战的地方,建造成本分别为pi,然后第i个公司会选择使用通讯站ai与bi,使用费用是ci,然后问这个通讯公司怎么建站能够获利最大.(净获利=总收益-总成本): 网上看到一 ...

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

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

最新文章

  1. 如何搭建一个你喜欢的工作环境
  2. 【你知道HHTP各种状态代表什么意思吗?】
  3. 深度学习入门篇--手把手教你用 TensorFlow 训练模型
  4. cp文件服务器,docker容器与物理机的文件传输—docker cp命令
  5. [20180123]测试SQLNET.EXPIRE_TIME参数.txt
  6. php在类方法里面检测错误,是否有任何PHP静态分析器可以检测不存在的类方法调用?...
  7. 抛物线交点式公式_二次函数顶点式、交点式、两根式概念解读
  8. 32位单片机应用场合_全球首款基于 RISC-V 的 32 位通用单片机出现
  9. 信号峰峰值Vpp与功率和dbm的换算
  10. 十折交叉验证 matlab,Matlab 十折交叉验证
  11. 苹果iPad mini 5蜂窝数据版上架:3896元起
  12. 新版仿山楂岛留言PHP源码+短视频/公众号吸粉引流
  13. Flutter iOS问题记录 - Fastlane打包的ipa包上传fir后不显示应用版本名称
  14. 迪士尼超级计算机多少钱,上海迪士尼乐园公布票务调整方案,明年1月9日起实行新票价...
  15. 事业单位人力资源开发中的职业发展分析
  16. 什么是JPA、JPA的基础实战
  17. 使用win中excel打开linux下.csv文件乱码问题
  18. python爬小说代码_中文编程,用python编写小说网站爬虫
  19. 只能输入字母的c语言程序设计教程课后答案,c语言程序设计基础教程_习题答案解析.doc...
  20. APP收款语音播报功能讲解

热门文章

  1. jQuery下载和使用
  2. 计算机主机自动关机如何设置,电脑设置如何自动关机【图文教程】
  3. Google Guava EventBus 消息发布-订阅异步调用使用
  4. Lizard工具的使用
  5. Linux操作系统中常见的英文报错
  6. 星际战一直显示网络无法连接服务器,所有战网应用均无法连接到服务器,无法登陆...
  7. Zoreto+坚果云+pdf expert(papership) 实现文献管理和批注同步
  8. SuperMap iClient3D for WebGL教程(特效)- 平行光源
  9. python变量、数据类型
  10. 微信公众号怎么申请注册?看这一篇就够了