这个没啥难的.

只保留可以转移最短路的边,然后拆点跑一个最大流即可.

#include <bits/stdc++.h>
#define N 1004
#define M 250004
#define ll long long
#define inf 200000000001
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int s,t,tot,n,m,eds;
int vis[N],current[N],id[N][2],hd[N],to[M],nex[M],val[M],cc[N],U[M],V[M],VAL[M];
void add(int u,int v,int c)
{
nex[++eds]=hd[u],hd[u]=eds,to[eds]=v,val[eds]=c;
}
struct Dijkstra
{
ll d[N];
int done[N];
struct Node
{
int u;
long long dis;
Node(int u=0,ll dis=0):u(u),dis(dis){}
bool operator<(Node b) const
{
return b.dis<dis;
}
};
priority_queue<Node>q;
void dijkstra(int aa)
{
memset(d,0x3f,sizeof(d));
for(d[aa]=0,q.push(Node(aa,0));!q.empty();)
{
Node e=q.top();q.pop();
int u=e.u;
if(done[u]) continue;
done[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(d[v]>d[u]+val[i])
{
d[v]=d[u]+val[i];
q.push(Node(v, d[v]));
}
}
}
}
}S,T;
int d[M];
struct Edge
{
ll cap;
int u,v;
Edge(int u=0,int v=0,ll cap=0):u(u),v(v),cap(cap){}
};
queue<int>q;
vector<Edge>edges;
vector<int>G[N];
void addedge(int u,int v,ll c)
{
edges.push_back(Edge(u,v,c));
edges.push_back(Edge(v,u,0));
int p=edges.size();
G[u].push_back(p-2);
G[v].push_back(p-1);
}
int BFS()
{
memset(vis,0,sizeof(vis));
d[s]=0,q.push(s),vis[s]=1;
for(;!q.empty();)
{
int u=q.front(); q.pop();
for(int i=0;i<G[u].size();++i)
{
Edge e=edges[G[u][i]];
if(e.cap>0&&!vis[e.v])
{
vis[e.v]=1;
d[e.v]=d[u]+1;
q.push(e.v);
}
}
}
return vis[t];
}
ll dfs(int x,ll cur)
{
if(x==t) return cur;
ll f,flow=0;
for(int i=0;i<G[x].size();++i)
{
Edge e=edges[G[x][i]];
if(e.cap>0 && d[e.v]==d[x]+1)
{
f=dfs(e.v,min(cur,1ll*e.cap));
if(f) flow+=f,cur-=f,edges[G[x][i]].cap-=f,edges[G[x][i]^1].cap+=f;
}
if(!cur) break;
}
return flow;
}
ll maxflow()
{
ll flow=0;
for(;BFS();) flow+=dfs(s,inf);
return flow;
}
int main()
{
int i,j,k;
// setIO("input");
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i) id[i][0]=++tot, id[i][1]=++tot;
for(i=1;i<=m;++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c), add(a,b,c),add(b,a,c);
U[i]=a,V[i]=b,VAL[i]=c;
}
for(i=1;i<=n;++i) scanf("%d",&cc[i]);
S.dijkstra(1);
T.dijkstra(n);
addedge(id[1][0],id[1][1],inf);
addedge(id[n][0],id[n][1],inf);
for(i=2;i<n;++i)
{
addedge(id[i][0],id[i][1],cc[i]);
}
for(i=1;i<=m;++i)
{
int a=U[i],b=V[i];
if(S.d[a]+T.d[b]+VAL[i]==S.d[n])
{
addedge(id[a][1],id[b][0],inf);
}
swap(a,b);
if(S.d[a]+T.d[b]+VAL[i]==S.d[n])
{
addedge(id[a][1],id[b][0],inf);
}
}
s=id[1][0],t=id[n][1];
printf("%lld\n",maxflow());
return 0;
}

  

BZOJ 3931: [CQOI2015]网络吞吐量 Dijkstra+最大流的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...

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

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

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

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

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

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

随机推荐

  1. (一)Spring概念

    目录 Spring是开源的轻量级框架 Spring核心 Spring是一站式的框架 Spring版本 Spring是开源的轻量级框架 开源是什么,不用多说: 轻量级:Spring框架的使用,不需要依赖 ...

  2. 第十一章 ZYNQ-MIZ701 PS读写PL端BRAM

      本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将 ...

  3. 【数据结构】P1996 约瑟夫问题

    [题目链接] https://www.luogu.org/problem/P1996 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数, ...

  4. 【KMP】Radio Transmission

    问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...

  5. AlertManager 部署及使用

    熟悉了 Grafana 的报警功能,但是 Grafana 的报警功能目前还比较弱,只支持 Graph 的图表的报警.今天来给大家介绍一个功能更加强大的报警工具:AlertManager. 简介 之前我 ...

  6. ubuntu+nginx+uwsgi部署django web项目

    前言 将本地开发的django项目部署至linux上的uwsgi服务器,并配置nginx,完成基于ubuntu+nginx+uwsgi的上线运行.下面整理相关步骤. 服务器配置virtualenv 如 ...

  7. poj 3468 整理一下线段树的写法

    // 对于延迟更新,我们在updata 和query的时候 pushdown和pushup两个东西都要存在 #include <iostream> #include <cstdio& ...

  8. 12-MySQL DBA笔记-MySQL复制

    第12章 MySQL复制 本章将为读者讲述MySQL的复制技术,首先,介绍最基础的主从复制,它是其他所有复制技术的基础,接着再为读者讲述各种复制架构的搭建,最后,列举了一些常见的复制问题及处理方式.复 ...

  9. 【原创】大叔经验分享(76)confluence和jira配置

    一 下载 confluence https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-conf ...

  10. 垃圾分类常见APP

    垃圾分类指南app 上海就要实行垃圾分类了,垃圾分类指南app你需要吗,这里有相关的各种垃圾分类的介绍与上海垃圾分类投放指南,这里是垃圾分类指南手机入口能够让你更好的去完成垃圾分类呢.垃圾分类指 .. ...