[JSOI2008]Blue Mary的旅行

时间:2021-11-06 00:56:40

嘟嘟嘟



看\(n\)那么小,就知道是网络流。然后二分,按时间拆点。



刚开始我看成所有航班一天只能起飞一次,纠结了好一会儿。但实际上是每一个航班单独考虑,互不影响。

建图很显然,拆完点后每一个点的第\(i\)天向和他相连的点的第\(i + 1\)天连边,同时自己的第\(i\)天也要向第\(i + 1\)天连边。



刚开始数组开小了,自己造了几组大数据才对。不过说来也奇怪,自己的随机数据跑出来都3、4秒,交上去却秒A了。可能是因为自己的答案都是1或2吧,出题人为了防止固输骗分,就没有造这种极端数据。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 62505;
const int maxe = 1e6 + 5;
const int maxm = 2455;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n, m, tot, t;
struct Node
{
int x, y, w;
}ed[maxm]; struct Edge
{
int nxt, to, cap, flow;
}e[maxe];
int head[maxn], ecnt = -1;
In void addEdge(int x, int y, int w)
{
//printf("()%d %d %d\n", x, y, w);
e[++ecnt] = (Edge){head[x], y, w, 0};
head[x] = ecnt;
e[++ecnt] = (Edge){head[y], x, 0, 0};
head[y] = ecnt;
} int dis[maxn];
In bool bfs()
{
Mem(dis, 0); dis[0] = 1;
queue<int> q; q.push(0);
while(!q.empty())
{
int now = q.front(); q.pop();
//printf("#%d\n", now);
for(int i = head[now], v; ~i; i = e[i].nxt)
{
if(!dis[v = e[i].to] && e[i].cap > e[i].flow)
{
dis[v] = dis[now] + 1;
q.push(v);
}
}
}
return dis[t];
}
int cur[maxn];
In int dfs(int now, int res)
{
if(now == t || res == 0) return res;
int flow = 0, f;
for(int& i = cur[now], v; ~i; i = e[i].nxt)
{
if(dis[v = e[i].to] == dis[now] + 1 && (f = dfs(v, min(res, e[i].cap - e[i].flow))) > 0)
{
e[i].flow += f, e[i ^ 1].flow -= f;
flow += f, res -= f;
if(res == 0) break;
}
}
return flow;
}
In int maxflow()
{
int flow = 0;
while(bfs())
{
memcpy(cur, head, sizeof(head));
flow += dfs(0, INF);
}
return flow;
} int _Max = 0;
In int num(int x, int tim, int id) {return (x - 1) * tim + id;}
In bool judge(int tim)
{
ecnt = -1; Mem(head, -1);
t = num(n, tim, tim) + 1;
_Max = max(_Max, t);
for(int i = 1; i <= m; ++i)
for(int j = 1; j < tim; ++j) addEdge(num(ed[i].x, tim, j), num(ed[i].y, tim, j + 1), ed[i].w);
for(int i = 1; i <= tim; ++i)
{
addEdge(0, num(1, tim, i), INF);
addEdge(num(n, tim, i), t, INF);
}
for(int i = 1; i <= n; ++i)
for(int j = 2; j <= tim; ++j) addEdge(num(i, tim, j - 1), num(i, tim, j), INF);
return maxflow() >= tot;
} int main()
{
//freopen("ha.in", "r", stdin);
Mem(head, -1);
n = read(), m = read(), tot = read();
for(int i = 1; i <= m; ++i) ed[i].x = read(), ed[i].y = read(), ed[i].w = read();
int L = 0, R = tot * n + 1;
while(L < R)
{
int mid = (L + R) >> 1;
if(judge(mid)) R = mid;
else L = mid + 1;
}
write(L - 1), enter;
//write(_Max), enter;
return 0;
}

[JSOI2008]Blue Mary的旅行的更多相关文章

  1. 【BZOJ1570】&lbrack;JSOI2008&rsqb;Blue Mary的旅行 动态加边网络流

    [BZOJ1570][JSOI2008]Blue Mary的旅行 Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决 ...

  2. bzoj1570&colon; &lbrack;JSOI2008&rsqb;Blue Mary的旅行&lpar;二分&plus;网络流&rpar;

    1570: [JSOI2008]Blue Mary的旅行 题目:传送门 题解: get到拆点新姿势,还是做题太少了...ORZ 因为每天就只能有一个航班,那就不能直接连了,所以要拆点(然后就被卡住了) ...

  3. bzoj 1570&colon; &lbrack;JSOI2008&rsqb;Blue Mary的旅行

    Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买 ...

  4. BZOJ1570 &lbrack;JSOI2008&rsqb;Blue Mary的旅行

    建分层图,每一层表示一天的情况 从S向第0层的1号点连边,每层的n向T连INF的边 枚举天数,每多一天就多建一层然后跑最大流,如果当前流量大于人数则输出答案 由于路径长度不会超过n,因此tot个人走这 ...

  5. BZOJ 1570&colon; &lbrack;JSOI2008&rsqb;Blue Mary的旅行&lpar; 二分答案 &plus; 最大流 &rpar;

    二分答案, 然后对于答案m, 把地点分成m层, 对于边(u, v), 第x层的u -> 第x+1层的v 连边. 然后第x层的u -> 第x+1层的u连边(+oo), S->第一层的1 ...

  6. 【bzoj1507】 JSOI2008—Blue Mary的旅行

    http://www.lydsy.com/JudgeOnline/problem.php?id=1570 (题目链接) 题意 给出$m$个航班,每天只能做一次飞机,有$T$人从起点到终点,问最晚到达的 ...

  7. bzoj1567&colon; &lbrack;JSOI2008&rsqb;Blue Mary的战役地图

    将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...

  8. 数据结构(线段树):BZOJ 1568 &lbrack;JSOI2008&rsqb;Blue Mary开公司

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit ...

  9. BZOJ 1567&colon; &lbrack;JSOI2008&rsqb;Blue Mary的战役地图&lpar; 二分答案 &plus; hash &rpar;

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

随机推荐

  1. IOS关于UIViewController之间的切换

    IOS关于UIViewController之间的切换 1.NavigationController切换UIViewController的两种方式 方法一右侧进入 1 SecondViewControl ...

  2. 【Mood-12】Android开发相关书籍推荐

    新年伊始,找到Android进阶干货若干,2015拜读. 1.Android应用UI设计模式 目前,谷歌Android操作系统在移动市场中风头正劲,并且未来发展势不可挡.<Android应用UI ...

  3. 01-语言入门-01-A&plus;B Problem

    题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=1    描述 此题为练手用题,请大家计算一下a+b的值   输入 输入两个数,a,b 输 ...

  4. StreamReader和StreamWrite与FileStream区别

    具体用法不在赘述. 记录一下用法的区别 StreamReader: FileStream fs = new FileStream(@"D:\Readme.txt",FileMode ...

  5. Swift 语法须知

    什么是swift? swift是 2014 WWDC 发布的一款脚本语言. 使用Swift的好处: OC ARC    最大的困难  内存管理 而  swift  不用担心内存方面.   简洁 ,功能 ...

  6. AOP技术基础

    1.引言 2.AOP技术基础 3.Java平台AOP技术研究 4..Net平台AOP技术研究 2.1 AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto ...

  7. Zend与PHP之间到底是什么关系

    Zend与PHP之间是什么关系 What is Zend's relationship with PHP? 每次看到PHP虚拟机中出现zend.zendvar之类的都很困惑,特意查了一下... PHP ...

  8. ubuntu下cannot find lib&period;&period;&period;&period;so&period;x 寻找动态链接库

    默认从/lib . /usr/lib 以及配置文件/etc/ld.so.conf内所列的目录下加载.so文件, 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld ...

  9. PAT Sign In and Sign Out&lbrack;非常简单&rsqb;

    1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...

  10. 51NOD 1057 N的阶乘

    1057 N的阶乘 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   输入N求N的阶乘的准确值.   Input 输入N(1 <= N <= 10000) ...