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< ...
随机推荐
- springMVC获取request和response
转载:http://blog.sina.com.cn/s/blog_7085382f0102v9jg.html 1.参数 例如: @RequestMapping("/test") ...
- 代码自动生成工具_java版
项目结构: 这里要实现的功能是,当我们给出了bean,如:Admin,User,People等实体类后, 我想用代码自动生成我想要的代码,最后生成的效果: 也就是说为每一个bean都生成相应的Dao, ...
- Java API —— File类
1.File类的概述 文件和目录路径名的抽象表示形式,创建File对象后,仅仅是一个路径的表示,不代码具体的事物一定是存在的. 2.构造方法 · public File ...
- 在Ubuntu下安装imx6linux系统的交叉编译环境遇到的问题总结
这段时间一直忙于手上的嵌入式项目,可以说自己从嵌入式的菜鸟一点点的入门了,关于嵌入式和imx6核心板的开发有了一点的了解,尤其是对于板子环境的搭建.硬件的开发,搭建环境,是一个很大的工程量,也是很重要 ...
- .net MVC APi调用
常用的调用方法为Get/Post Get方法: 服务器 public string Get(int id) { return "value"; } 这个直接在网页就可以测试,用 h ...
- nyoj-291 互素数个数 欧拉函数
LK的数学题 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 LK最近遇到一个问题,需要你帮她一下.一个整数n,求[1,n)中,和n互素的数的个数. 输入 多组测 ...
- RecyclerView(6)自定义RecyclerView.LayoutManager
A LayoutManager is responsible for measuring and positioning item views within a RecyclerView as wel ...
- [POJ3694]Network(LCA, 割边, 桥)
题目链接:http://poj.org/problem?id=3694 题意:给一张图,每次加一条边,问割边数量. tarjan先找出所有割边,并且记录每个点的父亲和来自于哪一条边,然后询问的时候从两 ...
- 分解成3NF保持函数依赖且为无损连接的算法
分解成3NF保持函数依赖且为无损连接的算法: 1.根据分解成3NF的保持函数依赖的分解算法(http://www.cnblogs.com/bewolf/p/4443919.html),得到分解结果ρ ...
- 面试题_1_to_16_多线程、并发及线程的基础问题
多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗?能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引 ...