bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=3931
【题意】
只能通过1-n的最短路,求网络最大流
【思路】
分别以1,n为起点做最短路,则可以判断一条边是否在最短路上。
以最短路构建网络,并且将一个点拆成两个中间连c[i]表示结点容量限制。
【代码】
- #include<set>
- #include<cmath>
- #include<queue>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
- #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
- using namespace std;
- typedef long long ll;
- const int N = 2e3+;
- const int M = 4e5+;
- const int inf = 1e9;
- const ll llinf = 1e18;
- ll read() {
- char c=getchar();
- ll f=,x=;
- while(!isdigit(c)) {
- if(c=='-') f=-; c=getchar();
- }
- while(isdigit(c))
- x=x*+c-'',c=getchar();
- return x*f;
- }
- struct DEdge {
- int u,v; ll cap,flow;
- };
- struct Dinic {
- int n,m,s,t;
- int d[N],cur[N],vis[N];
- vector<int> g[N];
- vector<DEdge> es;
- queue<int> q;
- void init(int n) {
- this->n=n;
- es.clear();
- FOR(i,,n) g[i].clear();
- }
- void clear() {
- FOR(i,,(int)es.size()-) es[i].flow=;
- }
- void AddEdge(int u,int v,ll w) {
- es.push_back((DEdge){u,v,w,});
- es.push_back((DEdge){v,u,,});
- m=es.size();
- g[u].push_back(m-);
- g[v].push_back(m-);
- }
- int bfs() {
- memset(vis,,sizeof(vis));
- q.push(s); d[s]=; vis[s]=;
- while(!q.empty()) {
- int u=q.front(); q.pop();
- FOR(i,,(int)g[u].size()-) {
- DEdge& e=es[g[u][i]];
- int v=e.v;
- if(!vis[v]&&e.cap>e.flow) {
- vis[v]=;
- d[v]=d[u]+;
- q.push(v);
- }
- }
- }
- return vis[t];
- }
- ll dfs(int u,ll a) {
- if(u==t||!a) return a;
- ll flow=,f;
- for(int& i=cur[u];i<g[u].size();i++) {
- DEdge& e=es[g[u][i]];
- int v=e.v;
- if(d[v]==d[u]+&&(f=dfs(v,min(a,e.cap-e.flow)))>) {
- e.flow+=f;
- es[g[u][i]^].flow-=f;
- flow+=f; a-=f;
- if(!a) break;
- }
- }
- return flow;
- }
- ll MaxFlow(int s,int t) {
- this->s=s,this->t=t;
- ll flow=;
- while(bfs()) {
- memset(cur,,sizeof(cur));
- flow+=dfs(s,llinf);
- }
- return flow;
- }
- } dc;
- struct Edge {
- int u,v;ll w; int nxt;
- }e[M];
- int en=,front[N];
- void adde(int u,int v,ll w)
- {
- e[++en]=(Edge){u,v,w,front[u]}; front[u]=en;
- }
- int n,m;
- ll c[N],dis1[N],dis2[N];
- int inq[N]; queue<int> q;
- void spfa(int s,ll* dis)
- {
- memset(inq,,sizeof(inq));
- FOR(i,,n) dis[i]=llinf;
- q.push(s); inq[s]=; dis[s]=;
- while(!q.empty()) {
- int u=q.front(); q.pop();
- inq[u]=;
- trav(u,i) {
- int v=e[i].v;
- if(dis[v]>dis[u]+(ll)e[i].w) {
- dis[v]=dis[u]+(ll)e[i].w;
- if(!inq[v]) {
- inq[v]=; q.push(v);
- }
- }
- }
- }
- }
- int main()
- {
- n=read(),m=read();
- FOR(i,,m) {
- int u=read(),v=read(); ll w=read();
- adde(u,v,w),adde(v,u,w);
- }
- dc.init(n*+);
- spfa(,dis1),spfa(n,dis2);
- ll dist=dis1[n];
- FOR(i,,n)
- c[i]=read(),dc.AddEdge(i,i+n,c[i]);
- for(int i=;i<=en;i+=) {
- int u=e[i].u,v=e[i].v;
- if(dis1[u]>dis1[v]) swap(u,v);
- if((ll)dis1[u]+e[i].w+dis2[v]==dist)
- dc.AddEdge(u+n,v,inf),dc.AddEdge(v+n,u,inf);
- }
- printf("%lld\n",dc.MaxFlow(n+,n));
- return ;
- }
P.S. spfa写错还浑然不知,省选药丸的节奏QWQ
bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)的更多相关文章
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
- 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: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- ●BZOJ 3931 [CQOI2015]网络吞吐量
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...
- BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】
传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...
- BZOJ 3931: [CQOI2015]网络吞吐量 Dijkstra+最大流
这个没啥难的. 只保留可以转移最短路的边,然后拆点跑一个最大流即可. #include <bits/stdc++.h> #define N 1004 #define M 250004 #d ...
- 【bzoj3931】[CQOI2015]网络吞吐量 最短路+最大流
题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发 ...
- 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...
随机推荐
- Java学习笔记之:Java 继承
一.引言 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承可以理解为一个对象从另一个对象获取属性的过程. 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类 ...
- Java学习笔记之:java环境搭建
一.准备工作 在学习java之前需要安装对配置java的运行环境,所以我们需要安装以下软件: 1.java jdk 2.eclipse 二.配置环境变量 1.首先,找到你刚才安装的JDK的安装目录,我 ...
- ArcGIS 10.1 for Desktop新特性之地理标记照片
转自:http://blog.csdn.net/esrichinacd/article/details/7730825 地理标记照片是指带有地理位置信息的照片,通常通过内置GPS的数码相机或智能手机拍 ...
- 配置Excel的DCOM权限
异常详细信息: System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-00000000004 ...
- android rabbitMQ
http://www.cnblogs.com/wufawei/archive/2012/03/31/2427823.html http://www.raywenderlich.com/5527/get ...
- 富有魅力的git stash
git stash 会把当前的改动暂时搁置起来, 也就是所谓的git 暂存区. 你可以执行 git stash list 来查看你所有暂存的东东. 也可以 git stash apple ** 来拿下 ...
- class_create()
#define class_create(owner, name) \({ \ ...
- WinCE启动次数的记录
最近一周一直在忙于测试NAND文件系统的稳定性和可靠性,今天终于有所进展.测试组所有同事齐上阵,加上小高和我,测试了一天,都未发现问题.虽然还不能保证完全OK,但至少有所改善了. 测试组今天主要做了文 ...
- BZOJ2229: [Zjoi2011]最小割
题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...
- ubuntu下安装使用vmware、kvm、xen
一. 概念介绍: (1)全虚拟化(Full Virtulization) 简介:主要是在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行, 速度会根据不同的实 ...