bzoj 3931 最短路+最大流
较水,但因为范围问题WA了两次。。。。
/**************************************************************
Problem: 3931
User: idy002
Language: C++
Result: Accepted
Time:392 ms
Memory:3224 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define min(a,b) ((a)<(b)?(a):(b))
#define N 1100
#define M 200010
#define oo 0x3f3f3f3f
using namespace std; typedef long long dnt;
struct Pair {
int u;
dnt d;
Pair( int u, dnt d ):u(u),d(d){}
bool operator<( const Pair &p ) const { return d>p.d; }
};
struct Edge {
int u, v, f;
Edge( int u, int v, int f ):u(u),v(v),f(f){}
};
struct Dinic {
int src, dst;
vector<Edge> edge;
vector<int> g[N];
int dep[N], cur[N], qu[N], bg, ed;
void init( int src, int dst ) {
this->src = src;
this->dst = dst;
}
void adde( int u, int v, int f ) {
g[u].push_back( edge.size() );
edge.push_back( Edge(u,v,f) );
g[v].push_back( edge.size() );
edge.push_back( Edge(v,u,) );
}
bool bfs() {
memset( dep, , sizeof(dep) );
qu[bg=ed=] = src;
dep[src] = ;
while( bg<=ed ) {
int u=qu[bg++];
for( int t=; t<g[u].size(); t++ ) {
Edge &e = edge[g[u][t]];
if( e.f && !dep[e.v] ) {
dep[e.v] = dep[e.u]+;
qu[++ed] = e.v;
}
}
}
return dep[dst];
}
dnt dfs( int u, dnt a ) {
if( u==dst || a== ) return a;
dnt remain=a, past=, na;
for( int &t=cur[u]; t<g[u].size(); t++ ) {
Edge &e = edge[g[u][t]];
Edge &ve = edge[g[u][t]^];
if( e.f && dep[e.v]==dep[e.u]+ && (na=dfs(e.v,min(remain,e.f))) ) {
remain -= na;
past += na;
e.f -= na;
ve.f += na;
if( !remain ) break;
}
}
return past;
}
dnt maxflow() {
dnt rt = ;
while( bfs() ) {
memset( cur, , sizeof(cur) );
rt += dfs(src,0x3f3f3f3f3f3f3f3fll);
}
return rt;
}
}D; int n, m;
int head[N], cc[N], dest[M], wght[M], next[M], etot;
dnt dis[][N];
int in[N], out[N], src, dst, idc; void adde( int u, int v, int w ) {
etot++;
dest[etot] = v;
wght[etot] = w;
next[etot] = head[u];
head[u] = etot;
}
void dijstra( int src, dnt dis[] ) {
static bool done[N];
memset( done, false, sizeof(done) );
priority_queue<Pair> q;
q.push( Pair(src,) );
dis[src] = ;
while( !q.empty() ) {
Pair p = q.top();
q.pop();
int u=p.u;
if( done[u] ) continue;
done[u] = true;
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t], w=wght[t];
if( dis[v]>dis[u]+w ) {
dis[v]=dis[u]+w;
q.push( Pair(v,dis[v]) );
}
}
}
}
void makeid() {
idc = ;
for( int i=; i<=n; i++ ) {
in[i] = ++idc;
out[i] = ++idc;
}
src = out[];
dst = in[n];
}
void build() {
memset( dis, 0x3f, sizeof(dis) );
dijstra( , dis[] );
dijstra( n, dis[] );
makeid();
D.init( src, dst );
for( int i=; i<=n; i++ )
if( dis[][n]==dis[][i]+dis[][i] )
D.adde( in[i], out[i], cc[i] );
for( int u=; u<=n; u++ )
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t], w=wght[t];
if( dis[][u]+dis[][v]+w==dis[][n] )
D.adde( out[u], in[v], oo );
}
}
int main() {
scanf( "%d%d", &n, &m );
for( int i=,u,v,w; i<=m; i++ ) {
scanf( "%d%d%d", &u, &v, &w );
adde( u, v, w );
adde( v, u, w );
}
for( int i=; i<=n; i++ )
scanf( "%d", cc+i );
build();
printf( "%lld\n", D.maxflow() );
}
bzoj 3931 最短路+最大流的更多相关文章
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- BZOJ 3931 网络吞吐量(最短路+拆点最大流)
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1607 Solved: 652 [Submit][St ...
- hdu5294||2015多校联合第一场1007 最短路+最大流
http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...
- 【最短路+最大流】上学路线@安徽OI2006
目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- P3376 【模板】网络最大流——————Q - Marriage Match IV(最短路&最大流)
第一道题是模板题,下面主要是两种模板,但都用的是Dinic算法(第二个题也是) 第一题: 题意就不需要讲了,直接上代码: vector代码: 1 //invalid types 'int[int]' ...
- bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...
- BZOJ 3931: [CQOI2015]网络吞吐量 最大流
3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
3931: [CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活 动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器 ...
随机推荐
- JavaScript 金额、数字、千分位、千分位、保留几位小数、舍入舍去、支持负数
JavaScript 金额.数字 千分位格式化.保留指定位数小数.支持四舍五入.进一法.去尾法 字段说明: number:需要处理的数字: decimals:保留几位小数,默认两位,可不传: dec_ ...
- HADOOP百度云资料
百度云下载地址: 链接:http://pan.baidu.com/s/1pL56hkv 密码:u4h3 解压密码:www.mukedaba.com
- jQuery插件之ajaxFileUpload(异步上传图片并实时显示,并解决onchange后ajaxFileUpload失效问题)
参考学习: 第一篇:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 第二篇:http://www.jb51.net/a ...
- 随机数生成 && 生成执行锁
生成随机数列: openssl rand -base64 uuidgen echo $RANDOM | md5sum echo $RANDOM | sha256sum 随机小写10个字母 随机数: [ ...
- IIS 启用https
参考:http://www.cnblogs.com/dudu/p/iis_https_ca.html
- R语言以及RStdio的安装
R语言: 首先从官网上下载R安装包, 提供了Linux, (Mac) OS X, Windows的安装包相关下载链接. RStdio: RStdio(官网)是R言语非常实用的IDE, 是一个免费的软件 ...
- Python_oldboy_自动化运维之路(四)
本节内容 集合 字符编码与转码 函数语法及基本特性 函数参数与局部变量 返回值和嵌套函数 递归 匿名函数 高阶函数 1.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变 ...
- Oracle约束
1.非空约束 DROP TABLE member PURGE; CREATE TABLE member( mid NUMBER, name ) NOT NULL ); 2.唯一约束 DROP TABL ...
- Java将字符串转成二进制码
Java将字符串转成二进制码 public void toBinary(){ String str = "王雪"; char[] strChar=str.toCharArray() ...
- mvn本地库导入jar包
导入脚本 #!/bin/sh mvn deploy:deploy-file -DgroupId=com.xxx.xxx -DartifactId=包名 -Dversion=4.0 -Dpackag ...