1. 程式人生 > >網路流Dinic演算法模板(各種優化)

網路流Dinic演算法模板(各種優化)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f3f3f3f3f
#define ll long long
#define MAXN 10005
using namespace std;
int n,m;//點數、邊數 
int sp,tp;//原點、匯點 
struct node
{
	int v,next;
	ll cap;
}mp[MAXN*10];
int pre[MAXN],dis[MAXN],cur[MAXN];//cur為當前弧優化,dis儲存分層圖中每個點的層數(即到原點的最短距離),pre建鄰接表
int cnt=0;
void init()//不要忘記初始化
{
	cnt=0;
	memset(pre,-1,sizeof(pre));
}
void add(int u,int v,int w)//加邊 
{
	mp[cnt].v=v;
	mp[cnt].cap=w;
	mp[cnt].next=pre[u];
	pre[u]=cnt++;
}
bool bfs()//建分層圖
{
	memset(dis,-1,sizeof(dis));
	queue<int>q;
	while(!q.empty())
	q.pop();
	q.push(sp);
	dis[sp]=0;
	int u,v;
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		for(int i=pre[u];i!=-1;i=mp[i].next)
		{
			v=mp[i].v;
			if(dis[v]==-1&&mp[i].cap>0)
			{
				dis[v]=dis[u]+1;
				q.push(v);
				if(v==tp)
				break;
			}
		}
	}
	return dis[tp]!=-1;
}
ll dfs(int u,ll cap)//尋找增廣路
{
	if(u==tp||cap==0)
	return cap;
	ll res=0,f;
	for(int &i=cur[u];i!=-1;i=mp[i].next)
	{
		int v=mp[i].v;
		if(dis[v]==dis[u]+1&&(f=dfs(v,min(cap-res,mp[i].cap)))>0)
		{
			mp[i].cap-=f;
			mp[i^1].cap+=f;
			res+=f;
			if(res==cap)
			return cap;
		}
	}
	if(!res)
	dis[u]=-1;
	return res;
}
ll dinic()
{
	ll ans=0;
	while(bfs())
	{
		for(int i=1;i<=n;i++)
		cur[i]=pre[i];
		ans+=dfs(sp,inf);
	}
	return ans;
}
int main()
{
	
return 0;
}

相關推薦

網路Dinic演算法模板各種優化

#include <iostream> #include <cstdio> #include <cstring> #include <queue> #d

網路】Link-Cut Tree優化網路Dinic演算法

偶然在知乎上看到的一篇文章中提到了用動態樹優化Dinic的思路,遂記錄此隨筆方便之後學習。 Dinic演算法是一個非常優秀的解決網路流模型的演算法,然而時間複雜度上界是O(V2E),有可能會被毒瘤出題人卡掉。 使用LCT可以優化Dinic演算法來達到優秀的O(VElogV)的複雜度上界。 我們只需要實現

bzoj1001 [BeiJing2006]狼抓兔子網路dinic演算法||最短路spfa

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 24017  Solved: 6

網路24題之一】飛行員配對問題+求方案網路dinic演算法求二分圖最大匹配

題面 題目背景 第二次世界大戰時期.. 題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可

網路-Dinic演算法詳解與模板

Dinic演算法詳解: 我們已經學過了求最大網路流的EK演算法,EK演算法的思想是每次用bfs找增廣路,然後利用記錄的路徑回退到原點的過程更新網路。 (1)Dinic演算法的思路是這樣的:每次都不停地用BFS來構造“層次圖”,然後用“阻塞流”來增廣。這裡我特

求最大dinic演算法模板

//最短增廣路,Dinic演算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增弧 { edges.push_back((Edge){from,to,cap

網路相關演算法模板

#define INF 0x7fffffff //最小費用流模板 #define MAX_V 1005 typedef pair<int,int> P;//first儲存最短距離,second儲存頂點編號 //用於表示邊的結構體(終點,容量,費用反向邊) struct edge { in

模板】KM演算法模板帶註釋——二分圖帶權最大匹配

O(n^4) /*求最小值就把權值全部取相反數, 繼續套這個最大值的模板*/ #include <iostream> #include<cstring> #include

【專題總結】網路與二分圖持續更新

POJ 2112 大意 農夫約翰有 k 臺擠奶機和 c 只奶牛。任意兩個實體(擠奶機或奶牛)都在不同的地點,因此它們之間有相隔距離。每個擠奶機可以為 m 只奶牛擠奶。問怎樣分配擠奶機使得任意兩個實體之間的最長距離最小(每個奶牛都要分配到擠奶機,題目保證有

Dijkstra演算法模板POJ 3268很好的理解題 Silver Cow Party

Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29507 Accepted: 13395 Description One cow from ea

模板】圖論演算法模板持更

圖論 圖論是個大板塊,建模在圖論中佔有很重要的地位,至於演算法就是理解之後程式碼多敲敲,具體的架構還是差不多的。 圖論大概有3個級別,第一級別就是沒有邊權的圖,用於遍歷或者強連通SCC跑一波等等;第二級別就是有邊權的,這下演算法多了,各種最短路和最

【POJ - 2226】Muddy Fields匈牙利演算法網路dinic,二分圖匹配,最小點覆蓋,矩陣中優秀的建圖方式

題幹: Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 <= C <= 50). While good for the gra

網路EK演算法模板

程式碼 #include<cstdio> #include<iostream> #include<cstring> #include<cmath>

HDU -3549 (最大網路——Edmonds_Karp演算法+Dinic演算法)

HDU -3549 (最大網路流) Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the m

Control 網路dinic當前弧優化

題目: You, the head of Department of Security, recently received a top-secret information that a group of terrorists is planning to transpo

Drainage Ditches 網路 dinic 模板

題目: Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered

ACM網路模板更新ing...

1、 最大流 FF、EK、Dinic演算法比較 Dinic演算法 2、二分圖匹配 匈牙利演算法 3、最小費用流 SPFA演算法求解 Dijkstra演算法求解 1、最大流( FF、EK、Dinic演算法比較) Ford-Fulkerson演算法

Dinic模板 白書 最大

#include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<queue> using namespace std;

網路 Dinic + SAP模版

參考博文 參考博文 只列出幾種常見的,快的網路流演算法 1.Dinic Dinic利用dis陣列進行分層,每次流的時候都只流到下一層,大大減少時間複雜度 struct Edge{ int v, w, nxt; }; Edge e

網路最大 Dinic演算法

# 前言 看到網上好多都用的鏈式前向星,就我在用 $vector$ 鄰接表…… # 定義 先來介紹一些相關的定義。(個人理解) ## 網路 一個網路是一張帶權的有向圖 $G=(V,E)$ ,其中每任意一條邊 $(u,v)$ 的權值稱為這條邊的容量 $c(u,v)$ 。若這條邊不存在,對應的容量就為 $0$ 。