UVA1389 Hard Life (01分数规划+最大流)
UVA1389 Hard Life (01分数规划+最大流)
题目描述略
题解时间
$ (\frac{\Sigma EdgeCount}{\Sigma PointCount})_{max} $
是什么已经不用说了⑧
经典的01分数规划
上来先二分答案$ ans $
之后考虑判断
根据选边与选点的关系
考虑建出这样一个图:
建立源点 $ S $ 与汇点 $ P $
对于原图中的每条边看做一个点,从 $ S $ 向这个点建流量为 $ 1 $ 的边
对于原图中的每个点向 $ T $ 建流量为 $ ans $ 的边
对于原图中的每条边所代表的点,向这条边连接的两个点建流量为 $ 1 $ 的边
跑最大流, $ maxflow \leq m $ 即可
原理?
我们回顾一下柿子
$ \frac{\Sigma EdgeCount}{\Sigma PointCount} \leq ans $
转换一下就是
$ \Sigma EdgeCount-\Sigma PointCount*ans \leq 0 $
好像已经很明显了⑧
那就先这样吧(溜走)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
namespace LarjaIX
{
const int N=2011;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
const double dinf=1e8;
struct sumireko{int to,ne;double w;}e[N<<2];
int he[N],ecnt=1;
void addline(int f,int t,double w)
{
e[++ecnt].to=t,e[ecnt].w=w;
e[ecnt].ne=he[f],he[f]=ecnt;
e[++ecnt].to=f,e[ecnt].w=0;
e[ecnt].ne=he[t],he[t]=ecnt;
}
int head[N],dep[N];
queue<int>q;
bool ins[N];
bool bfs(int sp,int ep)
{
memcpy(head,he,sizeof(head));
memset(dep,0x3f,sizeof(dep));
dep[sp]=1,q.push(sp);
while(!q.empty())
{
int x=q.front();q.pop();
for(int ei=he[x],t=e[ei].to;ei;ei=e[ei].ne,t=e[ei].to)
if(dep[t]==inf&&e[ei].w>eps) dep[t]=dep[x]+1,q.push(t);
}
return dep[ep]!=inf;
}
double dfs(int x,double lim,int ep)
{
if(x==ep||lim<eps) return lim;
double ret=0,tmp=0;
for(int ei=head[x],t=e[ei].to;ei;ei=e[ei].ne,t=e[ei].to)
{
head[x]=ei;
if(dep[t]==dep[x]+1)if((tmp=dfs(t,min(e[ei].w,lim),ep))>eps)
{
lim-=tmp,ret+=tmp;
e[ei].w-=tmp,e[ei^1].w+=tmp;
if(lim<eps) break;
}
}
return ret;
}
double dinic(int sp,int ep)
{
double ret=0;
while(bfs(sp,ep)) ret+=dfs(sp,dinf,ep);
return ret;
}
int n,m;
int lx[N],ly[N];
int maid()
{
while(~scanf("%d%d",&n,&m))
{
if(!m){puts("1");puts("1");continue;}
for(int i=1;i<=m;i++) scanf("%d%d",&lx[i],&ly[i]);
double ansl=0,ansr=m,ansm=0,eeps=1.0/n/n;
while(ansr-ansl>eeps)
{
ansm=(ansl+ansr)/2;
for(int i=1;i<=m;i++) addline(n+i,lx[i],1.0),addline(n+i,ly[i],1.0);
for(int i=1;i<=m;i++) addline(n+m+1,n+i,1.0);
for(int i=1;i<=n;i++) addline(i,n+m+2,ansm);
double tmp=dinic(n+m+1,n+m+2);
if((double)m-tmp>eps) ansl=ansm;
else ansr=ansm;
ecnt=1,memset(he,0,sizeof(he));
}
ansm=ansl;
for(int i=1;i<=m;i++) addline(n+i,lx[i],dinf),addline(n+i,ly[i],dinf);
for(int i=1;i<=m;i++) addline(n+m+1,n+i,1.0);
for(int i=1;i<=n;i++) addline(i,n+m+2,ansm);
dinic(n+m+1,n+m+2);
bfs(n+m+1,n+m+2);
int ans=0;
for(int i=1;i<=n;i++) if(dep[i]!=inf) ans++;
printf("%d\n",ans);
for(int i=1;i<=n;i++) if(dep[i]!=inf) printf("%d\n",i);
ecnt=1,memset(he,0,sizeof(he));
}
return 0;
}
}
int main(){return LarjaIX::maid();}
UVA1389 Hard Life (01分数规划+最大流)的更多相关文章
- 【BZOJ4819】 新生舞会(01分数规划,费用流)
Solution 考虑一下这个东西的模型转换: \(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\) 然后转换一下发现显然是01分数规划. \(\sum_{i ...
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...
- 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流
[BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...
- P3705 [SDOI2017]新生舞会 01分数规划+费用流
$ \color{#0066ff}{ 题目描述 }$ 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一 ...
- BZOJ-4819: 新生舞会(01分数规划+费用流)
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
- BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】
题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]
3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
随机推荐
- 使用Jitpack发布开源Java库
原文:使用Jitpack发布开源Java库 | Stars-One的杂货小窝 很久之前也写过一篇使用Jitpack发布Android开源库的文章,详见Android开发--发布第三方库到JitPack ...
- Xshell在Windows和Linux间文件的上传和下载
本文通过lrzsz来实现Windows和Linux间文件间的文件传输. lrzsz使用 XMODEM.YMODEM 和 ZMODEM 文件传输协议来实现文件的上传和下载.相比 FTP 或者 WinSC ...
- SpringBoot整合Redis案例缓存首页数据、缓解数据库压力
一.硬编码方式 1.场景 由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度. 2.RedisTemplate Jedis是R ...
- [旧][Android] ButterKnife 浅析
备注 原发表于2016.05.08,资料已过时,仅作备份,谨慎参考 前言 自上星期写 Retrofit 写吐之后 ... 我问大队长能不能换个其他什么东西写,大队长就说了个单词 ButterKnife ...
- 5大知名的BI工具对比介绍
工欲善其事,必先利其器.企业对于BI工具的需求,已经刻不容缓.国内国外的BI工具不少,如Tableau.FineBI.Power BI.Smartbi等等.本文就对当下市面上最热门的5款知名的BI工具 ...
- SPYEYE手机远程监控和官方SPYEYE间谍软件最新下载方式
听起来远程控制手机好像很高级的样子,但是实现起来其实非常简单.实现原理如下: 运行程序,让程序不停地读取数据 用手机给手机发送邮件 判断是否读取到指定主题的手机,如果有,则获取手机内容 根据邮件内容, ...
- 【基础知识】 CPU 详细整理(个人整理)
本文只是个人对cpu的理解,不建议浏览 建议浏览:https://zhuanlan.zhihu.com/p/397260483 提要 64位/32位操作系统,64/32指的是通用寄存器的位数. 定义 ...
- StackExchange.Redis 实现SetNx
今天有同事指出如何在StackExchange.Redis 实现Redis的原生命令. ConnectionMultiplexer redis = ConnectionMultiplexer.Conn ...
- 转载-公司项目部署交付环境预检查shell脚本
大型项目环境预检查脚本,根据自己实际情况修改脚本中变量,给大家一个思路,转载请注明出处~ 转至:https://www.cnblogs.com/gaohongyu/p/13738526.html #! ...
- shell中echo基础及高级用法详解-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月19日 1.1 基础用法 echo命令用来输出文本,在shell脚本中用来输出提示信息用的比较多. 单引号:原样输出所有的内容,不用转义就能输出特殊 ...