UVA1389 Hard Life (01分数规划+最大流)

Luogu

题目描述略

题解时间

$ (\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分数规划+最大流)的更多相关文章

  1. 【BZOJ4819】 新生舞会(01分数规划,费用流)

    Solution 考虑一下这个东西的模型转换: \(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\) 然后转换一下发现显然是01分数规划. \(\sum_{i ...

  2. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  3. 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流

    [BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...

  4. P3705 [SDOI2017]新生舞会 01分数规划+费用流

    $ \color{#0066ff}{ 题目描述 }$ 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一 ...

  5. BZOJ-4819: 新生舞会(01分数规划+费用流)

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...

  6. BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】

    题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...

  7. ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)

    [题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...

  8. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

  9. 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 601  Solved: 313 Description 学校 ...

随机推荐

  1. Idea个人配置

    Intellij IDEA配置 1. 优化导包配置 2. 取消tab页单行显示 多行显示更多的文件,方便查看. 3. 双斜杠注释改成紧跟代码头 4. 选中复制整行 原本只会复制你选中的代码,改完配置后 ...

  2. k8s集群节点ping不通其他主机的ip

    文章目录 排查过程 本地宿主机网络检查 pod网络检查 tcpdump检查网络 检查flannel网卡 检查宿主机网卡 iptables检查 解决方法 测试环境服务出现问题,服务一直报错认证超时,检查 ...

  3. Dubbo基础二之架构及处理流程概述

    Dubbo基础一之实战初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中体验了Dubbo的使用,对于消费端对服务提供者的调用非常清晰明确.那么Dubbo是如何做到的呢?下面对Dub ...

  4. DDD与数据事务脚本

    DDD与数据事务脚本 扯淡 相信点进来看这篇文章的同学,大部分是因为标题里面的"DDD"所吸引!DDD并不是一个新技术,如果你百度一下它的历史就会知道,实际上它诞生于2004年, ...

  5. 一个杂项PDF

    不是很难,但是就是比较考虑个人的细心程度,下载压缩包解压得到一个pdf文件,直接打开发现没有什么隐藏的信息,准换成word也是,没有什么东西,使用winhex打开看一下,一开始是没有注意到什么的,这里 ...

  6. RFC2889MAC地址学习速率——网络测试仪实操

    一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...

  7. Spring Boot+RabbitMQ 通过fanout模式实现消息接收(支持消费者多实例部署)

    本文章适用的场景:同一条消息可以被多个消费者同时消费.注意:当消费者多实例部署时,会轮询消费消息.网上有大量的的案例展示:P生产一条消息,消费者服务C中建立Q1和Q2两个队列共同消费.但极少的材料展示 ...

  8. Blazor和Vue对比学习(基础1.1):组件结构

    难度:★ 简单说一说: 1.Vue和Blazor都遵循单文件结果,即HTML(视图模板).CSS(样式).JS/C#(代码逻辑)写在一个文件里,Vue的文件后缀为.vue,Blazor的文件后缀为.r ...

  9. 在 CentOS 或 RHEL 系统上检查可用的安全更新的方法

    当你更新系统时,根据你所在公司的安全策略,有时候可能只需要打上与安全相关的补丁.大多数情况下,这应该是出于程序兼容性方面的考量.那该怎样实践呢?有没有办法让 yum 只安装安全补丁呢? 答案是肯定的, ...

  10. Oracle之数据库的连接

    Oracle 默认用户 数据库创建完毕后,需要设置数据库的默认用户.Oracle中为管理员预置了两个用户分别是SYS和SYSTEM.SYS的初始密码为Oracle安装时设置的数据库口令 admin,在 ...