【题目链接】

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. Sina App Engine(SAE)教程(11)- Yaf使用

    Yaf参考资料 Yaf(Yet Another Framework)用户手册 想在SAE使用Yaf? 无需申请,sae环境已经全面支持. Yaf 实战 下面是一个运行在SAE的Yaf的hello wo ...

  2. 从零开始,让你的框架支持CocoaPods

    本文为投稿文章,作者:奴良(简书) 这两天一直琢磨着想让自己的一个照片多选框架支持CocoaPods下载安装,就搜了好多资料,但是搜到的资料大多都是最基本的,并没有解决我遇到的问题,问题如下: 当自己 ...

  3. PowerDesigner模型设计

    原文:PowerDesigner模型设计 绪论 Sybase PowerDesigner(简称PD)是最强大的数据库建模工具,市场占有率第一,功能也确实十分强大,现在最新版本是15.1,已经支持最新的 ...

  4. OSSEC配置文件ossec.conf中添加mysql服务

    配置路径:/opt/ossec/etc/ossec.conf <ossec_config>   <global>     <email_notification>y ...

  5. jQuery 、js 设置 显示隐藏

    小问题   jQuery 操作方式: $("#ddl").parent().attr("style", "display:none"); j ...

  6. PHP大神的十大优良习惯

    概述:通往PHP大神的道路上,应该保持优良的传统和习惯. 1.多阅读手册和源代码 没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西,特别是很多有关于字符串和数组的函数.就在这些 ...

  7. 9本java程序员必读的书

    来源:http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=202904638&idx=2&sn=21dd20438e32a ...

  8. php有些系统会报错或提示 Cannot modify header information - headers already sent by

    Warning: Cannot modify header information - headers already sent by (output started at /home/test/do ...

  9. trackr: An AngularJS app with a Java 8 backend – Part I

    该系列文章来自techdev 我想分享在techdev公司开发的项目-trackr-的一些最新的见解.trackr是一个用来跟踪我们的工作时间,创建报告和管理请假的web应用程序.做这个程序的目的有两 ...

  10. Xcode5 编译ffmpeg,arm64版本;H264

    编译选项:./configure  —-cc=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchai ...