题面

传送门

分析

考虑网络流

注意到数据包走的是最短路,所以我们只需要考虑在最短路上的边

由于最短路可能有多条,我们先跑一遍Dijkstra,然后再\(O(m)\) 遍历每条边(u,v,w)

如果dist[u]=dist[v]+w,则这条边肯定在最短路上

然后点的容量限制可以用拆点来解(常见套路),从u向u+n连边,容量为c[u]

原图中的边(u,v)在新图中变成边(u+n,v)

然后Dinic求最大流即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define maxn 1005
#define maxm 200005
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
int n,m;
vector<pair<int,long long> >G[maxn];
struct node{
int x;
long long d;
node(){ }
node(int u,long long dis){
x=u;
d=dis;
}
friend bool operator < (node p,node q){
return p.d>q.d;
}
};
long long dist[maxn];
int used[maxn];
void dijkstra(){
priority_queue<node>q;
q.push(node(1,0));
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
while(!q.empty()){
node now=q.top();
q.pop();
int x=now.x;
if(used[x]) continue;
used[x]=1;
int l=G[x].size();
for(int i=0;i<l;i++){
int y=G[x][i].first;
int len=G[x][i].second;
if(dist[y]>dist[x]+len){
dist[y]=dist[x]+len;
q.push(node(y,dist[y]));
}
}
}
} long long c[maxn];
struct edge{
int from;
int to;
int next;
long long flow;
}E[maxm<<1];
int sz=1;
int head[maxn];
void add_edge(int u,int v,long long w){
// printf("%d->%d : %d\n",u,v,w);
sz++;
E[sz].from=u;
E[sz].to=v;
E[sz].next=head[u];
E[sz].flow=w;
head[u]=sz;
sz++;
E[sz].from=v;
E[sz].to=u;
E[sz].next=head[v];
E[sz].flow=0;
head[v]=sz;
} int deep[maxn];
bool bfs(int s,int t){
queue<int>q;
memset(deep,0,sizeof(deep));
q.push(s);
deep[s]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=E[i].next){
int y=E[i].to;
if(E[i].flow&&!deep[y]){
deep[y]=deep[x]+1;
if(y==t) return 1;
q.push(y);
}
}
}
return 0;
} long long dfs(int x,int t,long long minf){
if(x==t) return minf;
long long k,rest=minf;
for(int i=head[x];i;i=E[i].next){
int y=E[i].to;
if(E[i].flow&&deep[y]==deep[x]+1){
k=dfs(y,t,min(rest,E[i].flow));
if(k==0) deep[y]=0;
E[i].flow-=k;
E[i^1].flow+=k;
rest-=k;
}
}
return minf-rest;
} long long dinic(int s,int t){
long long maxflow=0,nowflow=0;
while(bfs(s,t)){
while(nowflow=dfs(s,t,INF)) maxflow+=nowflow;
}
return maxflow;
} int main(){
int u,v;
long long w;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d %lld",&u,&v,&w);
G[u].push_back(make_pair(v,w));
G[v].push_back(make_pair(u,w));
}
for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
c[1]=c[n]=INF;
dijkstra();
for(int i=1;i<=n;i++){
add_edge(i,i+n,c[i]);
}
for(int i=1;i<=n;i++){
for(int j=0;j<G[i].size();j++){
int y=G[i][j].first;
long long len=G[i][j].second;
if(dist[y]==dist[i]+len){
add_edge(i+n,y,INF);
}
}
}
printf("%lld\n",dinic(1,n*2));
}

BZOJ 3931 (网络流+最短路)的更多相关文章

  1. BZOJ 3931 网络吞吐量(最短路+拆点最大流)

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1607  Solved: 652 [Submit][St ...

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

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

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

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

  4. 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量

    3931: [CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活 动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器 ...

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

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

  6. bzoj 3931 最短路+最大流

    较水,但因为范围问题WA了两次.... /************************************************************** Problem: 3931 Us ...

  7. BZOJ 3931 Dijkstra+网络流

    思路: (我能说按照题意模拟么) 用long long inf 要开大--. //By SiriusRen #include <queue> #include <cstdio> ...

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

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

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

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

随机推荐

  1. 基础入门Bootstrap

    一.CSS样式 1.图片 2.布局.排版(之全局显示) 3.容器-网格-栅格系统 搭建的格式如下 <!DOCTYPE html> <html> <head> < ...

  2. 10java进阶——IO2

    1. Properties类 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: Hashtable的子 ...

  3. Codeforces 图论题板刷(2000~2400)

    前言 首先先刷完这些在说 题单 25C Roads in Berland 25D Roads not only in Berland 9E Interestring graph and Apples ...

  4. 解决nginx proxy_pass反向代理cookie,session丢失的问题

    参考地址:https://www.jianshu.com/p/34abe7eb6f0b 为什么cookie 会丢失? 比如说一个没有经过代理的地址 : http://127.0.0.1/project ...

  5. pspice中参数的意义

    摘自:http://royroyyy.blog.163.com/blog/static/137650617201102610471196/ 有源器件在符号库中的名称(NAME)通常以关键字开头,后根长 ...

  6. Apache HttpClient之fluent API的使用

    该方法为Apache HttpClient 4.5以上的版本支持,在官网有明确的说明. 对比以前的方式,其优点是代码更简洁,同时为线程安全的.仅举一个最简单的post栗子 JAR包信息: <de ...

  7. ES6基本用法

    es6是JS(JavaScript)的下一个版本. 新增了let命令,用来声明变量.变量在第一个花括号内有用,先声明后引用.不允许重复声明.存在暂时性死区. const声明一个只读的常量.一旦声明,常 ...

  8. 英语单词deploy

    来源——https://www.docker.com/ Leading companies rely on our container platform to build, manage and se ...

  9. python之requests模块中的params和data的区别

    params的时候之间接把参数加到url后面,只在get请求时使用: import requests url='https://api.ireaderm.net/account/charge/info ...

  10. eclipse 报错:One or more constraints have not been satisfied.

    接受 我有同样的问题.在我的maven项目中添加速度依赖关系后,我在标记选项卡中得到相同的错误.然后我注意到maven项目创建的web.xml文件具有servlet2.3模式.当我将其更改为servl ...