【题目链接】

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]网络吞吐量(最短路,最大流)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【bzoj3931】[CQOI2015]网络吞吐量 最短路+最大流

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

  9. 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...

随机推荐

  1. TCL语言笔记:TCL练习二

    一.练习 1.二进制转十进制 proc b2d {b} { ;set len [string length $b] } {$i<$len} {incr i} { incr sum [expr , ...

  2. Hibernate逍遥游记-第5章映射一对多-01单向<many-to-one>、cascade="save-update"、lazy、TransientObjectException

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

  3. React如何性能调优

    一. 二.调优例子 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...

  4. win7进入不了系统故障修复

    问题: 由于电脑关机比较慢,等得不耐烦了,就强制关机了,以前都没事,直到昨晚打开电脑,提示windows错误恢复,试了好久,提示windows无法修复此计算机,看来是没办法了.后来进入系统还原后,总算 ...

  5. PHP程序员最常犯的11个MySQL错误

    对于大多数web应用来说,数据库都是一个十分基础性的部分.如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一份子. 对于很多新手们来说,使用PHP可以在短短几个小时之内轻松 ...

  6. js学习对象创建

    Object.extend = function(destination, source) {for (var property in source) {    destination[propert ...

  7. bzoj1913

    这是一道好题,要求每个三点圆覆盖的点数和 我们可以算四边形的贡献,四边形显然分成两种:凸四边形和凹四边形 显然,凹四边形的覆盖只可能是三个点组成三角形包含另一个点,所以贡献是1 凸四边形,其最小圆覆盖 ...

  8. HTML空格符号 &nbsp / &ensp / &emsp

      半角的不断行的空白格(推荐使用)    半角的空格    全角的空格

  9. 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。

    由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...

  10. codevs 1137 计算系数

    什么时候NOIP也要出二项式定理了? 二项式定理+逆元. #include<iostream> #include<cstdio> #include<cstring> ...