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< ...
随机推荐
- LR_问题_无法使用LR的Controller,提示缺少license
问题描述 无法使用LR的Controller,提示缺少license 问题解决 使用开始->所有程序->HP LoadRunner->loadrunner,在打开界面的左上角选择co ...
- spring是怎样面向接口编程的?
1.只要分层,就涉及到接口来连接.各层之间只通过接口来向外暴露功能. 2.spring中service层调用dao层时候,service层声明接口变量,具体接口实现可以ioc注入
- Ubuntu下编译运行Kamailio
kamailio----配置没有成功,这个文档过几天删除,因为这个项目的文档非常少,而且qq群里的人也不活跃,现在正在研究Freeswitch,如果能够满足,就不研究这个了,这篇文档会删除. Kama ...
- Hello World---C/C++
C #include <stdio.h> void main() { printf("Hello World!\n"); } C++ #include <iost ...
- CSDN代码片排版
CSDN上发博文,尤其是有代码的,要用好“插入代码”功能(见下图).这是必须的,未来的IT程序员,需要用这种方式,展示出自己的代码.这是尊重读者,树立品牌的需要. 相关方法,参考见视频<发布第一 ...
- 【HDOJ】1800 Flying to the Mars
1. 题目描述挺简单的一道题,给定$n$个大整数,求出现最多的次数. 2. 基本思路这题是可以使用哈希做,ELFHash等哈希都可以过. 3. 代码 /* 1800 */ #include <i ...
- 转:表单中Readonly和Disabled的区别(HTML中使用javascript解除禁止input输入框代)
转:表单中Readonly和Disabled的区别 参考资料: disabled和readonly区别: 参考博文1地址:http://blog.csdn.net/symgdwyh/article/d ...
- 一个简单的iBatis入门例子
一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...
- li添加浮动时不能完全包裹的方法
<html> <head> <meta http-equiv="Content-Type" content="text/html;chars ...
- C#委托的介绍(delegate、Action、Func、predicate)【转】
转自 http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1 ...