较水,但因为范围问题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 最短路+最大流的更多相关文章

  1. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  2. BZOJ 3931 网络吞吐量(最短路+拆点最大流)

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1607  Solved: 652 [Submit][St ...

  3. hdu5294||2015多校联合第一场1007 最短路+最大流

    http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...

  4. 【最短路+最大流】上学路线@安徽OI2006

    目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...

  5. [bzoj 1449] 球队收益(费用流)

    [bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...

  6. P3376 【模板】网络最大流——————Q - Marriage Match IV(最短路&最大流)

    第一道题是模板题,下面主要是两种模板,但都用的是Dinic算法(第二个题也是) 第一题: 题意就不需要讲了,直接上代码: vector代码: 1 //invalid types 'int[int]' ...

  7. bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...

  8. BZOJ 3931: [CQOI2015]网络吞吐量 最大流

    3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  9. 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量

    3931: [CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活 动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器 ...

随机推荐

  1. crond检查服务状态

    代码如下: * */1 * * * /etc/init.d/ntpd status;if [ $? -ne 0 ];then /etc/init.d/ntpd start; fi

  2. sleep允许休眠, delay不允许

    在Linux Driver开发中,经常要用到延迟函数:msleep,mdelay/udelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的. 1.)对于模块本身 mdelay是忙 ...

  3. rsync本地及远程复制备份【原创】

    1.安装rsyncyum instsall rsync 2.本地复制 rsync -auq --progress --delete /tongbu1/ /tongbu2/ rsync -auq --p ...

  4. ProtocolBuffer 使用及 一些坑

    Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. ProtocolBuffer的优势 跨平台: Prot ...

  5. 11 The Go Memory Model go语言内置模型

    The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...

  6. nginx php mysql日志配置

    1.编辑mysql的配置文件my.cnf,这个文件通常在/etc目录下,但我用rpm装mysql的时候这个配置文件是在/usr目录下,但我测试过,无论是放在/etc目录下,还是放在     /usr目 ...

  7. java IO流知识点总结

    I/O类库中使用“流”这个抽象概念.Java对设备中数据的操作是通过流的方式.表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节.IO流 ...

  8. (一)问候 HttpClient

    第一节: HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并 ...

  9. python 删除前3天的文件

    一.需求分析 1. 删除前3天的文件 2.如果目录为空,也一并删除掉 如果使用shell脚本,一条命令就搞定了.干啥还要用python? 1. 因为需要记录一些日志,使用shell不好实现 2. 作为 ...

  10. MySQL学习笔记:floor、round —— 取整

    在MySQL中做数值处理,需要取整或者四舍五入. floor:函数只返回整数部分,小数部分舍弃: round:函数四舍五入: END 2018-05-29 11:31:22