题面

传送门

分析

考虑网络流

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

由于最短路可能有多条,我们先跑一遍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. 一gradle创建SSM项目——依赖包

    build.gradle compile:编译时必须. runtime:运行时必须,包括编译时. testCompile:测试编译时必须. testRuntime:测试运行时必须,包括编译时. 注:此 ...

  2. linux详解 rsync 服务和配置文件

    首先要选择服务器启动方式: l      对于负荷较重的 rsync 服务器应该选择独立运行方式 l      对于负荷较轻的 rsync 服务器应该选择 xinetd 运行方式 l      创建配 ...

  3. 一、ffmpeg理论

    一.ffmpeg三件套 ffprobe看文件属性 ffmpeg 编转码 ffplay 播放器 C:\Users\Bruce\Desktop\Temp\ffmpeg\ffmpeg\ToolPack\ff ...

  4. 命令行界面CLI

    1.hive   -e --执行一个或多个查询 hive -e "select * from student limit 3" 2. hive -e     > 将临时查询保 ...

  5. 2018-10-16-weekly

    Algorithm 判断子序列 What 给定字符串 s 和 t ,判断 s 是否为 t 的子序列.如,"ace"是"abcde"的一个子序列,而"a ...

  6. alert(1) to win 9

    function escape(s) { function htmlEscape(s) { return s.replace(/./g, function(x) { return { '<': ...

  7. selenium 自动化的坑(2)

    UI自动化,一天一坑系列(2) 今天要介绍的坑是这样的:在使用google浏览器的过程中,F12查看页面元素,我的操作步骤是先F12,然后点击箭头,接着点击要查找的元素来实现元素查看,不知道你是不是这 ...

  8. NIO编程之多客户端聊天系统

    1. 服务端 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; im ...

  9. springboot2整合logback.xml动态修改日志打印级别

    今天找bug烦到了,生产上的日志级别不能修改,非常不利于排查问题,于是想到了动态修改日志打印级别, 因为上一周把项目升级成springboot2,并且使用logback.xml管理日志打印,所以修改也 ...

  10. dede织梦5.7上传图片302以及Error #2038问题解决

    dede织梦5.7上传图片302以及Error #2038问题解决 三月 19, 2012 · Posted in DEDE二次开发, PHP  Number of View: 1388 在后台图片集 ...