bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=3931
【题意】
只能通过1-n的最短路,求网络最大流
【思路】
分别以1,n为起点做最短路,则可以判断一条边是否在最短路上。
以最短路构建网络,并且将一个点拆成两个中间连c[i]表示结点容量限制。
【代码】
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 2e3+;
const int M = 4e5+;
const int inf = 1e9;
const ll llinf = 1e18; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct DEdge {
int u,v; ll cap,flow;
};
struct Dinic {
int n,m,s,t;
int d[N],cur[N],vis[N];
vector<int> g[N];
vector<DEdge> es;
queue<int> q;
void init(int n) {
this->n=n;
es.clear();
FOR(i,,n) g[i].clear();
}
void clear() {
FOR(i,,(int)es.size()-) es[i].flow=;
}
void AddEdge(int u,int v,ll w) {
es.push_back((DEdge){u,v,w,});
es.push_back((DEdge){v,u,,});
m=es.size();
g[u].push_back(m-);
g[v].push_back(m-);
}
int bfs() {
memset(vis,,sizeof(vis));
q.push(s); d[s]=; vis[s]=;
while(!q.empty()) {
int u=q.front(); q.pop();
FOR(i,,(int)g[u].size()-) {
DEdge& e=es[g[u][i]];
int v=e.v;
if(!vis[v]&&e.cap>e.flow) {
vis[v]=;
d[v]=d[u]+;
q.push(v);
}
}
}
return vis[t];
}
ll dfs(int u,ll a) {
if(u==t||!a) return a;
ll flow=,f;
for(int& i=cur[u];i<g[u].size();i++) {
DEdge& e=es[g[u][i]];
int v=e.v;
if(d[v]==d[u]+&&(f=dfs(v,min(a,e.cap-e.flow)))>) {
e.flow+=f;
es[g[u][i]^].flow-=f;
flow+=f; a-=f;
if(!a) break;
}
}
return flow;
}
ll MaxFlow(int s,int t) {
this->s=s,this->t=t;
ll flow=;
while(bfs()) {
memset(cur,,sizeof(cur));
flow+=dfs(s,llinf);
}
return flow;
}
} dc; struct Edge {
int u,v;ll w; int nxt;
}e[M];
int en=,front[N];
void adde(int u,int v,ll w)
{
e[++en]=(Edge){u,v,w,front[u]}; front[u]=en;
} int n,m;
ll c[N],dis1[N],dis2[N]; int inq[N]; queue<int> q;
void spfa(int s,ll* dis)
{
memset(inq,,sizeof(inq));
FOR(i,,n) dis[i]=llinf;
q.push(s); inq[s]=; dis[s]=;
while(!q.empty()) {
int u=q.front(); q.pop();
inq[u]=;
trav(u,i) {
int v=e[i].v;
if(dis[v]>dis[u]+(ll)e[i].w) {
dis[v]=dis[u]+(ll)e[i].w;
if(!inq[v]) {
inq[v]=; q.push(v);
}
}
}
}
} int main()
{
n=read(),m=read();
FOR(i,,m) {
int u=read(),v=read(); ll w=read();
adde(u,v,w),adde(v,u,w);
}
dc.init(n*+);
spfa(,dis1),spfa(n,dis2);
ll dist=dis1[n];
FOR(i,,n)
c[i]=read(),dc.AddEdge(i,i+n,c[i]);
for(int i=;i<=en;i+=) {
int u=e[i].u,v=e[i].v;
if(dis1[u]>dis1[v]) swap(u,v);
if((ll)dis1[u]+e[i].w+dis2[v]==dist)
dc.AddEdge(u+n,v,inf),dc.AddEdge(v+n,u,inf);
}
printf("%lld\n",dc.MaxFlow(n+,n));
return ;
}
P.S. spfa写错还浑然不知,省选药丸的节奏QWQ
bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)的更多相关文章
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
- 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]网络吞吐量
题链: 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 ...
- 【bzoj3931】[CQOI2015]网络吞吐量 最短路+最大流
题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发 ...
- 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...
随机推荐
- 客户端一个http连接包含两个方向,一个是这个http连接的输入,另一个是这个http连接的输出。
1.客户端一个http连接包含两个方向,一个是这个http连接的输入,另一个是这个http连接的输出. 利用httpclient进行ip地址和端口号连接后,http的输出端作为http请求参数设置.h ...
- 解决Nginx下WordPress后台404的问题
在把这个博客做好后,上传到nginx服务器上却出现问题. 首先是wordpress官方的伪静态是通过.htaccess实现的,但nginx并不支持.htaccess,无奈只好在网上找到wordpres ...
- 259. 3Sum Smaller
题目: Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 ...
- Android关于实现EditText中加多行下划线的的一种方法
1. 重写EditText public class LinedEditText extends EditText { private Paint linePaint; private float m ...
- bind搭建(二)反向解析
我们在上一节已经知道了怎么建立DNS的服务器端,可以实现了域名到IP之间的转换.那么好我们现在就来了解一下如何实现反向的DNS解析,也就是IP到域名的映射. 步骤如下: l 在/etc/named中 ...
- LRU缓存算法
http://blog.csdn.net/beiyeqingteng/article/details/7010411 http://blog.csdn.net/wzy_1988/article/det ...
- bzoj3926
题目的意思是叶子不超过20个……听说当初zjoi不少人被坑 分别对每个叶子以它为根dfs出20个dfs树,这样整个树的任何一个子串,都是某个dfs树上一个点到它的一个子孙的路径 每个dfs树,根到叶子 ...
- bzoj2878
又是环套树dp,这次不是我擅长的类型 首先考虑树上的暴力,肯定是穷举起点然后以起点为根dp 我们用g[i]表示以点i为期望走的路径总长,答案就是1/n*Σ(g[i]/d[i]) (d[i]表示点度数) ...
- bzoj1975
显然是类似k短路,直接不停增广即可 好久没写A*了,裸的A*可能会TLE 加点剪枝就卡过去了……… type node=record po,next:longint; cost:double; end ...
- UVa 10943 (数学 递推) How do you add?
将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ ...