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. Android Studio 设置/更改 SDK 路径

    网上看到有人说需要重启 Android Studio,感觉麻烦,就自己试了试其他方法,果然还是有的! 很简单,只需打开 File 菜单下的 Project Structure 就可以设置了,如图所示:

  2. ajax定义与开发最简五步骤

    ajax是什么? a (async异步)  j (javascript)  a (and)  x (xml)即异步的javascript和xml ajax特点:异步 不刷新整个页面 (局部刷新) we ...

  3. MyBatis 核心配置综述之 ResultSetHandler

    目录 ResultSetHandler 简介 ResultSetHandler 创建 ResultSetHandler 处理结果映射 DefaultResultSetHandler 源码解析 我们之前 ...

  4. 看完这篇还不清楚Netty的内存管理,那我就哭了!

    说明 在学习Netty的时候,ByteBuf随处可见,但是如何高效分配ByteBuf还是很复杂的,Netty的池化内存分配这块还是比较难的,很多人学习过,看过但是还是云里雾里的,本篇文章就是主要来讲解 ...

  5. Netty学习(十)-Netty文件上传

    今天我们来完成一个使用netty进行文件传输的任务.在实际项目中,文件传输通常采用FTP或者HTTP附件的方式.事实上通过TCP Socket+File的方式进行文件传输也有一定的应用场景,尽管不是主 ...

  6. kpm字符串匹配算法

    首先是简单的朴素匹配算法 /* * 返回子串t在主串s的位置,若不存在则返回0 */ public static int index(String s, String t) { int i = 0;/ ...

  7. intellIJ IDEA学习笔记3

    intellij idea 的快捷鍵 https://blog.csdn.net/wei83523408/article/details/60472168 https://www.cnblogs.co ...

  8. Spring入门(九):运行时值注入

    Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Spring表达式语言(SpEL) 1. 属性占位符 1.1 注入外部的值 1.1.1 使用Envi ...

  9. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  10. I firmly believe

    I firmly believe, what you plant now, you will harvest later.