qwq

首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点。

(然而我一开始想的却是erf)

考虑从小到大枚举天数,然后每次新建一层。

首先我们先让\(S->第0层的对应的起始节点\),流量为初始人数的边

然后相邻两层之间,若存在航班,则两个之间连流量为次数的边。

对应节点之间连\(inf\)的边,表示可以待在原地。

然后每一层的结束节点,都向T连边,表示每一天都可以有人到达终止节点。

然后直接跑最大流,假设初始人数是\(k\),每次让\(k-=maxflow\)

直到\(k=0\),输出对应的天数即可

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define mk make_pair
#define pb push_back
#define ll long long using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} const int maxn = 10010;
const int maxm = 2e6+1e2;
const int inf = 1e9; int point[maxn],nxt[maxm],to[maxm],val[maxm];
int cnt=1,n,m;
int h[maxn]; void addedge(int x,int y,int w)
{
nxt[++cnt]=point[x];
to[cnt]=y;
val[cnt]=w;
point[x]=cnt;
} void insert(int x,int y,int w)
{
addedge(x,y,w);
addedge(y,x,0);
} int s,t;
queue<int> q; bool bfs(int s)
{
memset(h,-1,sizeof(h));
h[s]=0;
q.push(s);
while (!q.empty())
{
int x= q.front();
q.pop();
for (int i=point[x];i;i=nxt[i])
{
int p=to[i];
if (h[p]==-1 && val[i]>0)
{
h[p]=h[x]+1;
q.push(p);
}
}
}
if (h[t]==-1) return false;
return true;
} int dfs(int x,int low)
{
if (x==t || low==0) return low;
int totflow=0;
for (int i=point[x];i;i=nxt[i])
{
int p = to[i];
if(h[p]==h[x]+1 && val[i]>0)
{
int tmp = dfs(p,min(low,val[i]));\
val[i]-=tmp;
val[i^1]+=tmp;
low-=tmp;
totflow+=tmp;
if(low==0) return totflow;
}
}
if(low>0) h[x]=-1;
return totflow;
} int dinic()
{
int ans=0;
while (bfs(s))
{
ans=ans+dfs(s,inf);
}
return ans;
} int x[maxm],y[maxm],w[maxm];
int k; int main()
{
s=maxn-10;
t=s+1;
n=read(),m=read(),k=read();
for (int i=1;i<=m;i++)
{
x[i]=read(),y[i]=read(),w[i]=read();
}
insert(s,1,k);
insert(n,t,k);
//dinic();
int ansflow=k;
ansflow-=dinic();
for (int i=1;i<=1000000;i++)
{
for(int j=1;j<=m;j++) insert(x[j]+(i-1)*n,y[j]+i*n,w[j]);
for(int j=1;j<=n;j++) insert(j+(i-1)*n,j+i*n,inf);
insert(n+i*n,t,k);
ansflow-=dinic();
if(!ansflow)
{
cout<<i<<endl;
return 0;
}
//cout<<i<<" "<<ansflow<<endl;
}
return 0;
}

洛谷4400 BlueMary的旅行(分层图+最大流)的更多相关文章

  1. 洛谷P1027 Car的旅行路线

    洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  2. DP【洛谷P2134】 百日旅行

    [洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...

  3. 洛谷 P2656 (缩点 + DAG图上DP)

    ### 洛谷 P2656 题目链接 ### 题目大意: 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖 ...

  4. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流

    题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...

  5. 【洛谷 P1251】 餐巾计划问题 (费用流)

    题目链接 我做的网络流24题里的第一题.. 想是不可能想到的,只能看题解. 首先,我们拆点,将一天拆成晚上和早上,每天晚上会受到脏餐巾(来源:当天早上用完的餐巾,在这道题中可理解为从原点获得),每天早 ...

  6. bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...

  7. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  8. 洛谷 P1027 Car的旅行路线

    P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...

  9. 洛谷 P1522 牛的旅行 Cow Tours 题解

    P1522 牛的旅行 Cow Tours 题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不 ...

随机推荐

  1. Android Studio 百度地图导航

    配置就不再多说了,上一篇已经详细说过了,这次就是根据经纬度坐标做地图导航,路径规划.直接上代码: package com.example.appview.mian_page.Frament.Anzhu ...

  2. 关于通用Mapper new Example使用记录

    关于通用MapperExample使用记录 环境准备 需要集成 mybatis 的 generator 插件,方便自动生成 实体类和 mapper 类,还可以生成xml,不过一般我们都不用 xml b ...

  3. Linux centos7 mysql 的安装配置

    2021-07-21 1. 创建用户 # 创建用户useradd mysql# 修改密码 passwd mysql 2. 下载 wget 网址 3. 解压 # 创建安装文件夹mkdir app# 解压 ...

  4. AndroidJetpack数据处理之数据库Room和懒加载Paging

    数据库工具:Room Room结构 导入依赖 app的build.gradle中开启kapt: apply plugin: 'kotlin-kapt' 并导入以下依赖: def room_versio ...

  5. JVM加载class文件的一些理解

    Java是一种动态解释型语言,类(class)只有被加载到JVM中后才能运行.每当一个Java程序运行时,都会有一个对应的JVM实例,只有当程序运行结束后,这个JVM才会退出.JVM实例通过调用类的m ...

  6. (一)Superset 1.3图表篇——Table

    本系列文章基于Superset 1.3.0版本.1.3.0版本目前支持分布,趋势,地理等等类型共59张图表.本次1.3版本的更新图表有了一些新的变化,而之前也一直没有做过非常细致的图表教程. 而且目前 ...

  7. GDAL 矢量裁剪栅格

    本节将介绍如何在Python中用GDAL实现根据矢量边界裁剪栅格数据. from osgeo import gdal, gdal_array import shapefile import numpy ...

  8. 《DotNet Web应用单文件部署系列》二、打包wwwroot文件夹

    在这篇文章中,你将学到web缓存规则,文件传输中用到的压缩格式,以及如何手写代码响应请求.最后还能学到快速打包wwwroot文件夹组件用法. 一.了解Response Header 当第一次加载程序时 ...

  9. 专项测试-App性能分析

    专项测试 app性能 Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastRece ...

  10. Stream流思想和常用方法

    一.IO流用于读写:Stream流用于处理数组和集合数据: 1.传统集合遍历: 2.使用Stream流的方式过滤: 其中,链式编程(返回值就是对象自己)中,filter使用的是Predicate函数式 ...