3931: [CQOI2015]网络吞吐量

链接

分析:

  跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define pa pair<LL,int>
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 = ;
const LL INF = 1e18;
int a[], b[];LL c[]; namespace Dijkstra{
LL dis[N]; bool vis[N]; int head[N], En;
struct Edge{ int to, nxt;LL w; } e[];
void add_edge(int u,int v,LL w) {
++En; e[En].to = v, e[En].w = w, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].w = w, e[En].nxt = head[v]; head[v] = En;
}
priority_queue< pa, vector< pa >, greater< pa > > q;
void solve() {
memset(dis, 0x3f, sizeof(dis));
dis[] = ; q.push(pa(, ));
while (!q.empty()) {
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push(pa(dis[v], v));
}
}
}
}
}
namespace Dinic {
struct Edge{ int to, nxt;LL cap; } e[];
int head[N], cur[N], q[N], dis[N], En = , S, T;
void add_edge(int u,int v,LL w) {
++En; e[En].to = v, e[En].cap = w, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].cap = , e[En].nxt = head[v]; 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 ++];
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] == - && e[i].cap > ) {
dis[v] = dis[u] + , q[++R] = v;
if (v == T) return ;
}
}
}
return ;
}
LL dfs(int u,LL flow) {
if (u == T) return flow;
LL 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(flow - used, e[i].cap));
if (tmp > ) {
e[i].cap -= tmp, e[i ^ ].cap += tmp, used += tmp;
if (used == flow) break;
}
}
}
if (used != flow) dis[u] = -;
return used;
}
LL dinic() {
LL ans = ;
while (bfs()) ans += dfs(S, INF);
return ans;
}
}
int main() {
int n = read(), m = read();
for (int i = ; i <= m; ++i) {
a[i] = read(), b[i] = read(), c[i] = read();
Dijkstra::add_edge(a[i], b[i], c[i]);
}
Dijkstra::solve();
for (int i = ; i <= m; ++i) {
if (Dijkstra::dis[a[i]] + c[i] == Dijkstra::dis[b[i]]) {
Dinic::add_edge(a[i] + n, b[i], INF);
}
if (Dijkstra::dis[b[i]] + c[i] == Dijkstra::dis[a[i]]) {
Dinic::add_edge(b[i] + n, a[i], INF);
}
}
for (int i = ; i <= n; ++i) {
int c = read();
if (i == || i == n) Dinic::add_edge(i, i + n, INF);
else Dinic::add_edge(i, i + n, c);
}
Dinic::S = , Dinic::T = n + n;
cout << Dinic::dinic();
return ;
}

3931: [CQOI2015]网络吞吐量的更多相关文章

  1. BZOJ 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Stat ...

  2. BZOJ 3931: [CQOI2015]网络吞吐量 最大流

    3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  3. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  4. bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...

  5. 3931: [CQOI2015]网络吞吐量【网络流】

    网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路 ...

  6. bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...

  7. ●BZOJ 3931 [CQOI2015]网络吞吐量

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...

  8. BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】

    传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...

  9. BZOJ 3931: [CQOI2015]网络吞吐量 Dijkstra+最大流

    这个没啥难的. 只保留可以转移最短路的边,然后拆点跑一个最大流即可. #include <bits/stdc++.h> #define N 1004 #define M 250004 #d ...

随机推荐

  1. oracle使用索引和不使用索引性能分析

    首先准备一张百万条数据的表,这样分析数据差距更形象! 下面用分页表数据对表进行分析,根据EMP_ID 字段排序,使用索引和不使用索引性能差距! sql查询语法准备,具体业务根据具体表书写sql语法: ...

  2. [翻译] PPiAwesomeButton

    PPiAwesomeButton https://github.com/pepibumur/PPiAwesomeButton UIButton category with new methods to ...

  3. [控件] TranformFadeView

    TranformFadeView 效果图: 源码地址: https://github.com/YouXianMing/UI-Component-Collection 注意: maskView是iOS8 ...

  4. 解决华为交换机S5700无法解除ip/Mac绑定的问题

    今天同事离职,需要解除他的个人笔记本Mac与ip的绑定 首先进入系统用户视图,然后进入vlanif4,解除151绑定 system-view interface vlanif 4 undo dhcp ...

  5. 占位符 %s

    a = input("Name:")b = input("Age:")c = input("Job:")d = input("ho ...

  6. DA-GAN技术【简介】【机器通过文字描述创造图像】

    [题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...

  7. [SHOI2008]小约翰的游戏

    题目 不会,抄论文 这是一个非常牛逼的东西,叫做\(anti\)博弈,就是进行最后一次操作的人输 我们考虑一下这道题 显然如果石子个数都是\(1\),那么有奇数堆石子先手必败,有偶数堆石子先手必胜 如 ...

  8. pytest 框架自动化Selenium 之yield 使用

    环境 python 3.7 由于3.0-3.5以下部分pytest可能有部分兼容问题安装建议2.7-2.9,3.5-最新 pip install pytest专属 pytest框架包 pip inst ...

  9. c模拟银行家资源分配算法

    #include<stdio.h> #define PNUMBER 5//进程个数 #define SNUMBER 3//资源种类个数 //资源的种类,三种 char stype[SNUM ...

  10. http协议中的keeplive是做什么的?它的适应场景是什么?

    1.Http底层也是通过TCP传输的. 2.HTTP keep-alive Http是一个”请求-响应”协议,它的keep-alive主要是为了让多个http请求共享一个Tcp连接,以避免每个Http ...