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. Python中模块的定义及案例

    1 a = '我是模块中的变量a' 2 3 def hi(): 4 a = '我是函数里的变量a' 5 print('函数"hi"已经运行!') 6 7 class Go2: 8 ...

  2. 018 磁盘 IO 性能监控/压测工具(sar、iotop、fio、iostat)

    1 sar 命令查看当前磁盘 IO 读写 sar(System Activity Reporter 系统活动情况报告)是 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告 ...

  3. 【C#TAP 异步编程】构造函数 OOP

    原文:异步 OOP 2:构造函数 (stephencleary.com) 异步构造带来了一个有趣的问题.能够在构造函数中使用会很有用,但这意味着构造函数必须返回一个表示将来将构造的值,而不是构造的值. ...

  4. Python 中的闭包和自由变量

    1.定义 在函数内部再定义一个函数,并且这个函数用到了外部函数的变量(LEGB),最后返回新建函数的函数名索引,那么将这样的能够访问其定义时所在的作用域的函数以及用到的一些变量称之为闭包.被引用的非全 ...

  5. Java:Path与Paths

    0.说明 用于读Path操作的接口(Path)与实现类(Paths) 1.模块:java.nio.file.Path.java.nio.file.Paths 2.方法 2.1.Paths 只有两个静态 ...

  6. RGBA()函数详解

    RGBA()函数详解 RGBA()函数用于设定颜色和颜色的透明度:

  7. 使用windows自带linux子系统开发esp32

    步骤: 1.打开windows商店,搜索ubuntu,安装18.04版本. 2.控制面板 /程序和功能 /打开或关闭windows功能 3.关机重启 4.打开刚安装得ubuntu,设置用户名和密码. ...

  8. css边框普通属性

    border :(边框): 其实现在的border是三个属性合成的, border-width:边框大小: border-style:边框的样式: border-color:边框的颜色: 合成以后的用 ...

  9. 一台电脑设置多个网段的IP地址

                    

  10. SQL从零到迅速精通【表连接查询】

    看了这些表连接,个人感觉'左外连接'.'右外连接'和'全外连接'应用好就可以了. 1.外连接 (1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录. 在student ...