ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流
题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次。要求输出一个阻塞流。
分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLPP)能够直接秒掉这一题。当然还有一种挽救的方式就是首先进行一次贪心预流,然后进行dinic。也是第一次听说还有贪心预流这回事,所以找了一份代码特地学习了一番。具体步骤如下:
1.首先将所有节点按照层次进行排序,对每个节点有in[i]和out[i]两个属性,前者表示能够流入到该节点的流量,后者表示能够流出该节点的流量;
2.从层次最低的节点(即源点)开始,设in[S] = inf,表示源点能够进入无限的流量,然后按照层次的递增来推流量,维护好每个节点的in和out值;
3.从层次最高的节点(即汇点)开始,将所有节点的in都清空为0,设in[T] = inf,表示汇点能够收集无限的流量,然后从后往前计算出每条边实际能够流动的流量。
- #include <cstdlib>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <iostream>
- #include <queue>
- using namespace std;
- const int N = ;
- const int M = ;
- const int inf = 0x3f3f3f3f;
- int n, m, L, SS, TT;
- int lv[N], rank[N], in[N], out[N];
- struct Edge {
- int v, c, nxt;
- }e[M<<];
- int idx, head[N];
- int dis[N];
- char vis[N];
- queue<int>q;
- void insert(int a, int b, int c) {
- e[idx].v = b, e[idx].c = c;
- e[idx].nxt = head[a];
- head[a] = idx++;
- }
- bool bfs() {
- memset(dis, 0xff, sizeof (dis));
- memset(vis, , sizeof (vis));
- dis[SS] = , vis[SS] = ;
- q.push(SS);
- while (!q.empty()) {
- int u = q.front();
- q.pop();
- vis[u] = ;
- for (int i = head[u]; ~i; i = e[i].nxt) {
- int v = e[i].v, c = e[i].c;
- if (dis[v] == - && c) {
- dis[v] = dis[u] + ;
- if (!vis[v]) {
- vis[v] = ;
- q.push(v);
- }
- }
- }
- }
- return dis[TT] != -;
- }
- int dfs(int u, int flow) {
- if (u == TT) return flow;
- int tf = , f;
- for (int i = head[u]; ~i; i = e[i].nxt) {
- int v = e[i].v, c = e[i].c;
- if (dis[u]+ == dis[v] && c && (f = dfs(v, min(flow-tf, c)))) {
- e[i].c -= f, e[i^].c += f;
- tf += f;
- if (tf == flow) return tf;
- }
- }
- if (!tf) dis[u] = -;
- return tf;
- }
- void dinic() {
- while (bfs()) {
- dfs(SS, inf);
- }
- }
- bool cmp(const int &a, const int &b) {
- return lv[a] < lv[b];
- }
- void greedy() {
- memset(in, , sizeof (in));
- memset(out, , sizeof (out));
- sort(rank+, rank++n, cmp);
- in[SS] = inf;
- for (int i = ; i <= n; ++i) {
- int u = rank[i];
- for (int j = head[u]; ~j; j = e[j].nxt) {
- int v = e[j].v, c = e[j].c;
- if (!(j & ) && in[u] > out[u]) {
- int f = min(c, in[u]-out[u]);
- in[v] += f, out[u] += f;
- }
- }
- }
- memset(in, , sizeof (in));
- in[TT] = inf;
- for (int i = n; i >= ; --i) {
- int v = rank[i];
- for (int j = head[v]; ~j; j = e[j].nxt) {
- int u = e[j].v, c = e[j^].c;
- if (j & && out[u] > in[u]) {
- int f = min(c, min(out[u]-in[u], in[v]));
- in[u] += f, in[v] -= f;
- e[j].c += f, e[j^].c -= f;
- }
- }
- }
- }
- int main() {
- int T;
- scanf("%d", &T);
- while (T--) {
- idx = ;
- memset(head, 0xff, sizeof (head));
- scanf("%d %d %d", &n, &m, &L);
- for (int i = ; i <= n; ++i) {
- rank[i] = i;
- scanf("%d", &lv[i]);
- if (lv[i] == ) SS = i;
- else if (lv[i] == L) TT = i;
- }
- int a, b, c;
- for (int i = ; i < m; ++i) {
- scanf("%d %d %d", &a, &b, &c);
- insert(a, b, c), insert(b, a, );
- }
- greedy(), dinic();
- for (int i = ; i < m; ++i) {
- printf("%d\n", e[i<<|].c);
- }
- }
- return ;
- }
ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流的更多相关文章
- 网络流--最大流--hlpp(预流推进)模板
//500ms 秒掉洛谷推流问题 #include <algorithm> #include <iostream> #include <cstring> #incl ...
- 洛谷4400 BlueMary的旅行(分层图+最大流)
qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...
- bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流_拆点_二分
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- ACdream 1017 [分层图][网络流]
/* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...
- 【bzoj2834】回家的路 分层图最短路
题目描述 输入 输出 样例输入 2 1 1 2 1 1 2 2 样例输出 5 题解 分层图最短路 dis[i][0]表示到i为横向时起点到i的最短路,dis[i][1]表示到i为纵向时起点到i的最短路 ...
- POJ 3662 Telephone Lines (分层图)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6785 Accepted: 2498 D ...
- [USACO09FEB] Revamping Trails 【分层图+Dijkstra】
任意门:https://www.luogu.org/problemnew/show/P2939 Revamping Trails 题目描述 Farmer John dutifully checks o ...
- ACdream 1229 Data Transmission
Data Transmission Special JudgeTime Limit: 12000/6000MS (Java/Others)Memory Limit: 128000/64000KB (J ...
- free(分层图最短路)(2019牛客暑期多校训练营(第四场))
示例: 输入: 3 2 1 3 11 2 12 3 2 输出:1 题意:求s,t最短路,可将k条边权值置零. 题解:分层图最短路原题 #include<bits/stdc++.h> usi ...
随机推荐
- UVA 12950 : Even Obsession(最短路Dijkstra)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Windows驱动开发(中间层)
Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...
- eclipse+maven 无法编译
Archive for required library: 'F:/mavenLib/org/mybatis/mybatis/3.4.1/mybatis-3.4.1.jar' in project ' ...
- c#之线程池
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- Unix网络编程--卷一:套接字联网API
UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...
- Educational Codeforces Round 16 A
Description he only king stands on the standard chess board. You are given his position in format &q ...
- jquery easyui中文培训文档
目 录 1.... Accordion(可折叠标签)... 2 1.1 实例... 2 1.2 参数... 3 2.... DateBox(日期框)... 4 2 ...
- sql 流水号
CREATE TABLE [dbo].[SriaNum] ( [Num] [int] NOT NULL) alter PROC dpIDS_GetSerialNumber@SerialNumber V ...
- flume系列之—flume ng使用demo
摘自:http://rjhym.blog.163.com/blog/static/28130232201263042013972/
- fragment (1)简单示例:定义,界面配置,fragment之间的跳转
fragment作用 同一程序中切换界面 比activity轻快,灵活. fragment代码示例 ide : android studio 1.2 sdk : 22 package com.exa ...