题面

传送门

分析

考虑网络流

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

由于最短路可能有多条,我们先跑一遍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. 深入JavaScript之获取cookie以及删除cookie

    cookie存在哪? 存在document.cookie中 ookie长啥样? cookie是一个字符串,长下面这样:“name=xxx; age=22;” 注意:分号后面有个空格,记住这一点,下面的 ...

  2. alert(1) to win 16

  3. alert(1) to win

    一. function escape(s) { return '<script>console.log("'+s+'");</script>'; } 两种思 ...

  4. 一个奇怪的问题:Last_Errno: 1264 Error 'Out of range value for column 0x322E36343030

    场景环境: 1. 主从都是:Server version: 5.7.16-log MySQL Community Server (GPL) 2.操作系统:CentOS release 6.7 (Fin ...

  5. 线程数设置和CPU数的关系

    一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数) 如果是CPU密集型应用,则线程池大小设置为N+1 如果是IO密集型应用,则线程池大小设置为2N+1(因为io读数据或者缓存的 ...

  6. Spring如何解决循环依赖问题

    目录 1. 什么是循环依赖? 2. 怎么检测是否存在循环依赖 3. Spring怎么解决循环依赖 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式. 通过这种解决方式,我们可 ...

  7. mobiscroll实现二级联动菜单

    mobiscroll是一款非常使用的移动端选择控件,一般用来日期时间的选择的多,其实从官网上可以看到它有很多方面的使用,这里就不一一介绍了,有兴趣可以去官网上查阅一下 https://demo.mob ...

  8. springboot2.0整合redis的发布和订阅

    1.Maven引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  9. Linux内核设计与实现 总结笔记(第二章)

    一.Linux内核中的一些基本概念 内核空间:内核可独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,称为内核空间. 进程上下文:当 ...

  10. vue双向数据绑定v-model

    1.双向数据绑定 <input v-model="msg" /> <template> <div id="app"> < ...