校内模拟赛 Attack's Fond Of LeTri
Attack's Fond Of LeTri
题意:
n个房子m条路径边的无向图,每个房子可以最终容纳b个人,初始有a个人,中途超过可以超过b个人,每条边有一个长度,经过一条边的时间花费为边的长度。求所有人都进入房子的最小时间。如果不能容纳所有人,输出最少多少人无法进入房子。
分析:
注意图不一定联通!!!
首先Floyd一遍,求出任意两点之间的距离,二分一个答案,然后拆点建二分图,S想每个点连a的容量,另一个点向T连b的容量,对于两个点a,b,如果dis[a][b]<=二分的这个数,就加入一条左边到右边的边,容量为inf。满流即可。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#define fore(i, u, v) for (int i = head[u], v = e[i].to; i; i = e[i].nxt, v = e[i].to)
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
}
const int N = , INF = 1e9;
struct Edge { int to, nxt, cap; } e[];
int head[N], q[], a[N], b[N], dis[N], cur[N];
int En = , S, T, n;
LL d[][], Sum; inline void add_edge(int u,int v,int f) {
++En; e[En].to = v, e[En].nxt = head[u], e[En].cap = f; head[u] = En;
++En; e[En].to = u, e[En].nxt = head[v], e[En].cap = ; head[v] = En;
}
bool bfs() {
for (int i = ; i <= T; ++i) dis[i] = -, cur[i] = head[i];
int L = , R = ; q[++R] = S; dis[S] = ;
while (L <= R) {
int u = q[L ++];
fore(i, u, v)
if (dis[v] == - && e[i].cap > ) {
dis[v] = dis[u] + ;
if (v == T) return true;
q[++R] = v;
}
}
return false;
}
int dfs(int u,int flow) {
if (u == T) return flow;
int used = , tmp;
for (int &i = cur[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] == dis[u] + && e[i].cap > ) {
tmp = dfs(v, min(e[i].cap, flow - used));
if (tmp > ) {
e[i].cap -= tmp, e[i ^ ].cap += tmp; used += tmp;
if (used == flow) break;
}
}
}
if (flow != used) dis[u] = -;
return used;
}
bool dinic(LL x, bool flag) {
S = , T = n + n + , En = ;
memset(head, , sizeof(head));
for (int i = ; i <= n; ++i) add_edge(S, i, a[i]), add_edge(i + n, T, b[i]);
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j)
if (d[i][j] <= x) add_edge(i, j + n, INF);
LL ans = ;
while (bfs()) ans += dfs(S, INF);
if (flag && ans != Sum) {
cout << "NO\n" << Sum - ans; exit();
}
return ans == Sum;
}
void solve(int m) {
for (int i = ; i <= n; ++i) Sum += a[i];
// memset(d, 0x3f, sizeof(d));
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j) d[i][j] = 1e18;
for (int i = ; i <= n; ++i) d[i][i] = ;
for (int i = ; i <= m; ++i) {
int u = read(), v = read(), w = read();
d[u][v] = min(d[u][v], (LL)w);
d[v][u] = min(d[v][u], (LL)w);
}
for (int k = ; k <= n; ++k)
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
LL L = 1e18, R = , ans = ;
for (int i = ; i <= n; ++i)
for (int j = ; j <= n; ++j) if (d[i][j] != 1e18) L = min(L, d[i][j]), R = max(R, d[i][j]); // 注意要有dis[i][j]!=1e18???
dinic(R, );
while (L <= R) {
LL mid = (L + R) >> ;
if (dinic(mid, )) R = mid - , ans = mid;
else L = mid + ;
}
cout << "YES\n" << ans << "\n";
}
int main() {
n = read();int m = read();
for (int i = ; i <= n; ++i) a[i] = read(), b[i] = read();
solve(m);
return ;
}
校内模拟赛 Attack's Fond Of LeTri的更多相关文章
- 【20170521校内模拟赛】热爱生活的小Z
学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...
- Java实现蓝桥杯第十一届校内模拟赛
有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...
- 【20170920校内模拟赛】小Z爱学习
所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...
- 校内模拟赛 Zbq's Music Challenge
Zbq's Music Challenge 题意: 一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$.对于一个序列$S$,它的得分是 $$BasicScore=A\times \sum ...
- 校内模拟赛 SovietPower Play With Amstar
SovietPower Play With Amstar 题意: 一棵二叉树,每次询问一条路径上的路径和,初始每个点有一个权值1,询问后权值变为0.$n \leq 10^7,m\leq10^6$ 分析 ...
- 校内模拟赛 虫洞(by NiroBC)
题意: n个点m条边的有向图,每一天每条边存在的概率都是p,在最优策略下,询问从1到n的期望天数. 分析: dijkstra. 每次一定会优先选dp最小的后继走,如果这条边不存在,选次小的,以此类推. ...
- 校内模拟赛 旅行(by NiroBC)
题意: n个点的无向图,Q次操作,每次操作可以连接增加一条边,询问两个点之间有多少条边是必经之路.如果不连通,输出-1. 分析: 首先并查集维护连通性,每次加入一条边后,如果这条边将会连接两个联通块, ...
- 校内模拟赛 coin
题意: n*m的棋盘,每个格子可能是反着的硬币,正着的硬币,没有硬币,每次可以选未选择的一行或者未选择的一列,将这一行/列的硬币取反.如果没有可选的或者硬币已经全部正面,那么游戏结束. 最后一次操作的 ...
- 校内模拟赛 Label
题意: n个点m条边的无向图,有些点有权值,有些没有.边权都为正.给剩下的点标上数字,使得$\sum\limits_{(u,v)\in E}len(u,v) \times (w[u] - w[v]) ...
随机推荐
- Android Java中的一些使用例子
connectivity= ConnectivityService.getInstance(context); ServiceManager.addService(Context.CONNECTIVI ...
- Django 使用模型的API
进入项目目录 python3运行 import os os.environ['DJANGO_SETTINGS_MODULE']= '项目.settings' import django django. ...
- go 排序sort的使用
已知一个的struct组成的数组,现在要按照数组中的一个字段排序.python有sort方法,那golang要怎么实现呢?其实golang也有sort方法,并且使用简单,功能强大. 我们先看一下sor ...
- zookeeper.Net
原文转至:http://www.cnblogs.com/shanyou/p/3221990.html 之前整理过一篇文章<zookeeper 分布式锁服务>,本文介绍的 Zookeeper ...
- element-ui的回调函数Events的用法
做轮播的时候想用这个change回调函数,但是官方文档上竟然就只列了这么一行东西,完全没有示例代码(也可能我没找到哈) 鼓捣了半天,东拼西凑终于找到了靠谱的使用方法,其实很简单 在轮播组件上加上@ch ...
- plsql备份表---只是表---不包含表数据
写这个的同时还在备份,表的数据进度很慢,数据太大了. 用的工具是plsql 导出表:点击 tool工具 ---> export user object 导出用户目标 ----> ...
- centos6.9NAT网络模式
1.对虚拟机进行设置,点击该虚拟机的设置在网络适配器下将网络连接设置为NAT模式. 2.对虚拟机进行设置,点击虚拟机左上方的编辑-->虚拟网络编辑器,将WMnet信息设置为NAT模式,其它的无需 ...
- 关于数据库不适合docker的原因(摘抄)
所有的服务都开始了容器化升级,在一切皆容器的主流思想下,无状态的服务采用容器化已经是大势所趋,常常困扰架构师的一个问题是,数据库是否需要容器化? 数据库不适合容器化的七大原因 1. 数据不安全 即使你 ...
- 【九校3D2T3】世界第一的猛汉王
[问题描述] 卡普地公司举办了「世界第一的猛汉王」全球大会,来自世界各地的猛汉为了争夺「猛汉王」的名号前来一决高下.现在举行的是弓箭组选拔赛.卡普地公司为比赛新建了一张PVP地图——「猛汉竞技场」.有 ...
- JavaScript中的typeof操作符用法实例
在Web前端开发中,我们经常需要判断变量的数据类型.鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof就是负责提供这方便信息的操作符. 对一个值使用t ...