HDU-1532

题意简单的来说就是从1点到n点,最大的流量是多少。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define _S(X) cout << x << ' ';
#define __S(x) cout << x << endl;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const LL mod = (int)1e9+;
const int N = ;
int head[N], w[N], to[N], nx[N];
int n, m, _u, _v, _w;
int tot, s, t;
int deep[N];
void add(int u, int v, int val){
w[tot] = val;
to[tot] = v;
nx[tot] = head[u];
head[u] = tot++;
} void init(){
memset(head, -, sizeof(head));
tot = ;
s = ;
t = n;
} int bfs(){
queue<int> q;
memset(deep, , sizeof(deep));
q.push(s);
deep[s] = ;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u]; ~i; i = nx[i]){
if(w[i] > && deep[to[i]] == ){
deep[to[i]] = deep[u] + ;
q.push(to[i]);
}
}
}
if(deep[t] > ) return ;
return ;
}
int Dinic(int u, int flow){
if(u == t) return flow;
for(int i = head[u]; ~i; i = nx[i]){
if(deep[u]+ == deep[to[i]] && w[i] > ){
int di = Dinic(to[i], min(w[i], flow));
if(di > ){
w[i] -= di, w[i^] += di;
return di;
}
}
}
return ;
}
int main(){
while(~scanf("%d%d", &m, &n)){
init();
for(int i = ; i <= m; i++){
scanf("%d%d%d", &_u, &_v, &_w);
add(_u, _v, _w);
add(_v, _u, );
}
s = ; t = n;
int ans = , tmp;
while(bfs()){
while(tmp = Dinic(s, INF)) ans += tmp;
}
printf("%d\n", ans);
}
return ;
}

Dinic 还可以用当前弧优化,记录了当前处理到那一条边,就不需要重头再遍历那些l边。

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define _S(X) cout << x << ' ';
#define __S(x) cout << x << endl;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const LL mod = (int)1e9+;
const int N = ;
int head[N], w[N], to[N], nx[N];
int n, m, _u, _v, _w;
int tot, s, t;
int deep[N], cur[N];
void add(int u, int v, int val){
w[tot] = val;
to[tot] = v;
nx[tot] = head[u];
head[u] = tot++;
} void init(){
memset(head, -, sizeof(head));
tot = ;
s = ;
t = n;
} int bfs(){
queue<int> q;
memset(deep, , sizeof(deep));
q.push(s);
deep[s] = ;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u]; ~i; i = nx[i]){
if(w[i] > && deep[to[i]] == ){
deep[to[i]] = deep[u] + ;
q.push(to[i]);
}
}
}
if(deep[t] > ) return ;
return ;
}
int Dinic(int u, int flow){
if(u == t) return flow;
for(int &i = cur[u]; ~i; i = nx[i]){
if(deep[u]+ == deep[to[i]] && w[i] > ){
int di = Dinic(to[i], min(w[i], flow));
if(di > ){
w[i] -= di, w[i^] += di;
return di;
}
}
}
return ;
}
int main(){
while(~scanf("%d%d", &m, &n)){
init();
for(int i = ; i <= m; i++){
scanf("%d%d%d", &_u, &_v, &_w);
add(_u, _v, _w);
add(_v, _u, );
}
s = ; t = n;
int ans = , tmp;
while(bfs()){
for(int i = ; i <= n; i++) cur[i] = head[i];
while(tmp = Dinic(s, INF)) ans += tmp;
}
printf("%d\n", ans);
}
return ;
}

当前弧优化

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define _S(X) cout << x << ' ';
#define __S(x) cout << x << endl;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const LL mod = (int)1e9+;
const int N = ;
int head[N], w[N], to[N], nx[N];
int vis[N], pre[N], id[N];
int n, m, _u, _v, _w;
int tot, s, t;
void add(int u, int v, int val){
w[tot] = val;
to[tot] = v;
nx[tot] = head[u];
head[u] = tot++;
} void init(){
memset(head, -, sizeof(head));
tot = ;
s = ;
t = n;
} int bfs(){
queue<int> q;
memset(vis, , sizeof(vis));
q.push(s);
vis[s] = ;
pre[s] = s;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u]; ~i; i = nx[i]){
if(!vis[to[i]] && w[i]){
pre[to[i]] = u;
id[to[i]] = i;
vis[to[i]] = ;
if(to[i] == t) return true;
q.push(to[i]);
}
}
}
return false;
}
int EK(){
int ans = ;
while(bfs()){
int mi = INF;
for(int i = t; i != s; i = pre[i]){
mi = min(mi, w[id[i]]);
}
for(int i = t; i != s; i = pre[i]){
w[id[i]] -= mi;
w[id[i]^] += mi;
}
ans += mi;
}
return ans;
}
int main(){
while(~scanf("%d%d", &m, &n)){
init();
for(int i = ; i <= m; i++){
scanf("%d%d%d", &_u, &_v, &_w);
add(_u, _v, _w);
add(_v, _u, );
}
s = ; t = n;
printf("%d\n", EK());
}
return ;
}

EK

HDU-1532 网络流裸题的更多相关文章

  1. HDU 1102 最小生成树裸题,kruskal,prim

    1.HDU  1102  Constructing Roads    最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> ...

  2. 【网络流#3】hdu 1532 - Dinic模板题

    输入为m,n表示m条边,n个结点 记下来m行,每行三个数,x,y,c表示x到y的边流量最大为c 这道题的模板来自于网络 http://blog.csdn.net/sprintfwater/articl ...

  3. 经典的最大流题POJ1273(网络流裸题)

    http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  4. HDU 1248 寒冰王座(完全背包裸题)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. HDU 2602 Bone Collector(01背包裸题)

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu Flow Problem (最大流 裸题)

    最大流裸题,贴下模版 view code#include <iostream> #include <cstdio> #include <cstring> #incl ...

  8. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  9. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

随机推荐

  1. 使用JavaScript的XMLHttpRequest+fromdata 传递blob到后端

    需要上传网页录音文件到服务器,写的艰辛,终于好了,C#端的代码失败的留作纪念,JS端也有失败的案例,就不放上来了 JavaScript: var form = new FormData(); form ...

  2. .net持续集成测试篇之Nunit that断言

    系列目录 that是Nunit的新语法,语义上不如简单断言,使用上也更加复杂,但是其功能更加强大. 其基本语法如下代码片段示: [Test] public void DemoTest() { bool ...

  3. c#异常后重试操作

    private void TryConnect(System.Action action)         {             int retries = 3;             whi ...

  4. istio入门教程

    广告 | kubernetes各版本离线安装包 安装 安装k8s 强势插播广告 三步安装,不多说 安装helm, 推荐生产环境用helm安装,可以调参 release地址 如我使用的2.9.1版本 y ...

  5. 12、面向对象的思想(OOP)

    面向对象与面向过程 1.都是解决问题的思维方式,都是代码的组织的方式: 2.解决简单的问题可以使用面向过程: 3.解决复杂的问题建议使用面向对象,微观处理依旧会使用面向过程. 对象的进化史(数据管理的 ...

  6. java学习-NIO(一)简介

    I/O简介 在 Java 编程中,直到最近一直使用 流 的方式完成 I/O.所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节.流 I/O 用于与外部世界接触. ...

  7. 基于Starling的mask实现

    作为一个从c++转过来的程序员,flash原生的自定义mask实在是太好用,能方便实现各种效果,比如新手引导的高亮.viewport效果等.可惜starling的显示对象并不支持mask特性,查阅go ...

  8. 阿里P8架构师浅析——MySQL的高并发优化

    一.数据库结构的设计 1.数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率. 2.能够用数字类型的字段尽量选择数字类型而不用字符串类型的 ...

  9. 学习Lowdb小型本地JSON数据库

    Lowdb是轻量化的基于Node的JSON文件数据库.对于构建不依赖服务器的小型项目,使用LowDB存储和管理数据是非常不错的选择. 一:lowdb 使用及安装 在项目中的根目录安装 lowdb 命令 ...

  10. 关于selenium自动化对iframe内嵌元素的处理

    今天上班闲来无聊,于是来练练自动化,结果碰上了可恶的iframe,楼主,以前也遇到过,但是一直也没搞懂怎么处理的,都是抄别人的代码,今天决定独立解决试试.首先先来认识什么是iframe,它就长下图这样 ...