BZOJ 3931: [CQOI2015]网络吞吐量 Dijkstra+最大流
这个没啥难的.
只保留可以转移最短路的边,然后拆点跑一个最大流即可.
#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+最大流的更多相关文章
- BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】
传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- BZOJ 3931: [CQOI2015]网络吞吐量 最大流
3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1555 Solved: 637[Submit][Stat ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
- bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...
- ●BZOJ 3931 [CQOI2015]网络吞吐量
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...
- 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...
- 3931: [CQOI2015]网络吞吐量【网络流】
网络吞吐量(network)题目描述路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路 ...
随机推荐
- 剑指offer29:最小的k个数
1 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 2 思路和方法,C++核心代码 2.1 sort()函数,ve ...
- Python可修改和不可修改类型变量(mutuable and immutuable)
通俗的讲,可修改可以理解为可以在数据所在内存地址直接修改,而不可修改则意味着一旦修改便是创建新的数据对象,而不是在原来的对象内存地址修改 1,Mutuable object [sourcecode l ...
- C语言存30位数字长的十进制方法
题目:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 首先: 1,30位数字的十进制,并没有一个数据类型可以存下30位的整数类型数字,所以考虑用字符串存储这个数据,遍历这个字符串,每个 ...
- django+pymysql搭建一个管理系统(一)
django+pymysql搭建一个管理系统(一) 后续进行代码更新,优化 一.程序架构 二.mysql表单创建 zouye库:存信息相关的 #班级表 create table classes( ci ...
- loj 2292「THUSC 2016」成绩单
loj 看着就很区间dp,所以考虑求\(f_{i,j}\)表示区间\([i,j]\)的答案.注意到贡献答案的方式是每次选一个连续段,拿走后剩下的段拼起来继续段,所以转移就考虑从最后一次选的方法转移过来 ...
- js-回文数
回文数 设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数. //回文数 let readline = require("readline-sync&quo ...
- appium-清空输入框的内容后,再次输入内容会回退最后两个字符串
问题描述 有两个输入框,用户名和密码输入框 调用set_text方法,输入用户名 再次调用set_text方法,输入密码 清空用户名输入框的内容后,再次输入内容会回退最后两个字符串 出问题的代码 de ...
- Windows Phone惨遭微软放弃
微软在电脑操作系统上的用户保有量一直处于遥遥领先的地位,特别是最新的Windows 10系统,一经推出,市场表现就比较好,但相比起来,微软的手机操作系统Windows Phone就被贴上“差等生”的标 ...
- Makefile中代码写在同一行和分开几行写有什么区别?
在Makefile中,写在同一行的代码就相当于是在Linux中的同一行命令行写的代码一样,是一次性执行的:如程序中如下编写Makefile代码(请注意,两个命令之间应该使用分号“:”来进行分隔): a ...
- Build with runtime packages
编译问题:为什么我去掉Build with runtime packages,编译没问题??? 如果不去掉,就有错误:[Linker Error] Unresolved external 'TXNet ...