3931: [CQOI2015]网络吞吐量
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]网络吞吐量的更多相关文章
- BZOJ 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1555 Solved: 637[Submit][Stat ...
- BZOJ 3931: [CQOI2015]网络吞吐量 最大流
3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
- 3931: [CQOI2015]网络吞吐量【网络流】
网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路 ...
- bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...
- ●BZOJ 3931 [CQOI2015]网络吞吐量
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...
- BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】
传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...
- BZOJ 3931: [CQOI2015]网络吞吐量 Dijkstra+最大流
这个没啥难的. 只保留可以转移最短路的边,然后拆点跑一个最大流即可. #include <bits/stdc++.h> #define N 1004 #define M 250004 #d ...
随机推荐
- 用C#自定义一个简单的集合
闲来无聊来自己做了一个简单的'集合',用来加深自己对集合的理解 class listNode { private object value; public listNode(object _value ...
- 3. 跟踪标记 (Trace Flag) 1204, 1222 抓取死锁信息
跟踪标记:1204/1222 功能及用途: 捕获SQL Server死锁信息,并自动存放到错误日志(ERRORLOG)中. 举例: USE tempdb GO CREATE TABLE t1(id i ...
- C# 输入一个整数,求质因数
质数,质因数 应该都了解,在这里不过多解释,直接上代码: List<int> results = new List<int>(); int number = Int32.Par ...
- Hadoop HBase概念学习系列之优秀行键设计(十六)
我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...
- 内置数据结构(tuple)
一.元组(tuple) 元组不能增.删和改,所以元组的元素只能查. tp = tuple() #初始化一个元组 tp = () #同上 tp = (1, 2, 3, 4,) #错误的定义元组方式 t ...
- September 06th 2017 Week 36th Wednesday
I love you not for who you are, but for who I am with you. 我爱你并不是因为你是谁,而是我在你面前可以是谁. I love you just ...
- [EffectiveC++]item44:将与参数无关的代码抽离templates
- 我做SAP CRM One Order redesign的一些心得体会
框架开发和应用程序的开发完全不一样. 举个具体的最近折腾我的例子: 创建新的service order,维护header的shipping data,此时order和shipping data的mod ...
- React 入门学习笔记1
摘自阮一峰:React入门实例教程,转载请注明出处. 一. 使用React的html模板 使用React, 我们需要加载3个库,react.js, react-dom.js, 和browser.js. ...
- 怎么在移动端模拟pc端进行web开发调试日志
由于移动端开发,许多地方需要进行手势交互开发,而在pc模拟手机浏览器中不能进行模拟手势,所以无法查看日志,于是网上找了一个,腾讯vConsole,感觉还可以,分享给大家安装也方便 我的项目是基于vue ...