poj 1273 網路流板子題
Problem:
給了一個源點,一個匯點,一些節點之間的容量,求最大網路流。
Solution:
用dinic求一下即可。
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<vector>
#include<fstream>
#include<list>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(s) memset(s,0,sizeof(s))
const double PI = 3.141592653589;
const int INF = 0x3fffffff;
const int maxn = 200;
int G[maxn+5][maxn+5];
int layer[maxn+10];
bool visited[maxn+10];
int n, m;
bool count_layer() {//bfs 分層
queue<int> q; q.push(1);
memset(layer, -1, sizeof(layer));
layer[1] = 0;
while(!q.empty()) {
int v = q.front(); q.pop();
for (int i = 1; i <= m; i++) {
if(layer[i] == -1 && G[v][i] > 0) {
layer[i] = layer[v]+1;
if(i == m)
return true;
q.push(i);
}
}
}
return false;
}
int dinic() {
deque<int> dq;//可以通過下標訪問的棧
int ans = 0;
int s, t, idx, mins;
while(count_layer()) {//只要還可以分層
ms(visited);
visited[1] = true;
dq.push_back(1);
while(!dq.empty()) {
int v = dq.back();
if(v == m) {//找到一條增廣路徑
mins = INF;
for(int i = 1; i < dq.size(); i++) {//找到最小容量
s = dq[i-1]; t = dq[i];
if(G[s][t] < mins) {
mins = G[s][t];
idx = s;
}
}
ans += mins;
for(int i = 1; i < dq.size(); i++) {//重建殘餘網路
s = dq[i-1]; t = dq[i];
G[s][t] -= mins;
G[t][s] += mins;
}
while(!dq.empty() && dq.back() != idx) {//回溯
dq.pop_back();
visited[dq.back()] = false;
}
}
else {//dfs找增廣路徑
for(int i = 1; i <= m; i++) {
if(G[v][i] > 0 && layer[i] == layer[v]+1 && !visited[i]) {
dq.push_back(i);
visited[i] = true;
break;
}
if(i == m)//回溯
dq.pop_back();
}
}
}
}
return ans;
}
int main() {
// freopen("/Users/really/Documents/code/input","r",stdin);
// freopen("/Users/really/Documents/code/output","w",stdout);
ios::sync_with_stdio(false);
int s, e, c;
while(cin >> n >> m) {
ms(G);
for(int i = 0; i < n; i++) {
cin >> s >> e >> c;
G[s][e] += c;
}
cout << dinic() << endl;
}
return 0;
}
相關推薦
poj 1273 網路流板子題
Problem: 給了一個源點,一個匯點,一些節點之間的容量,求最大網路流。 Solution: 用dinic求一下即可。 #include<cstdio> #include<iostream> #include<sstre
POJ 1273(網路流-附hllp+sap模板)
網路流入門題目 Program P1273; Var n,m,i,j,x,y,p,level:longint; map,f:array[1..400,1..400] of longint; list:array[0..400,0..400] of lo
【COGS 14】 [網絡流24題] 搭配飛行員 網絡流板子題
str main head fin i++ add pri can tail 用網絡流水二分圖的模型(存一下板子) #include <cstdio> #include <cstring> #include <algorithm> #d
Farm Tour POJ - 2135(網路流)
傳送門 題意:農夫的朋友前來拜訪,於是他帶領大家參觀它的農場,農場裡有N塊地,其中農夫的家在1號地,而N號地有個很大的倉庫。農場內有M條道路(雙向通行),道路i連線著ai號地和bi號地,長度為ci。農夫希望按照從家裡出發,經過若干地後達到倉庫,然後再返回家中的順序待朋友參觀。如果要求往返不能經過
Dining POJ - 3281 (網路流)
傳送門 題意:農夫約翰為他的N頭牛準備了F種食物和D種飲料。每頭牛都有各自喜歡的食物和飲料,而每種食物或飲料只能分配給一頭牛。最多能有多少頭牛同時得到自己喜歡的食物和飲料? 題解:如果只是分配食物的話,那麼用二分圖最大匹配就好了,但遇到這種情況需要同時給一頭牛分配所喜歡的食物和飲料的情況,就
【網路流24題】飛行員配對方案問題
題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的飛行員才能使一次派出最多的飛機。對於給定
dinic求解二分圖最大匹配&&網路流24題之飛行員配對方案問題
在二分圖的基礎上增加源S和匯T。1、S向X集合中每個頂點連一條容量為1的有向邊。2、Y集合中每個頂點向T連一條容量為1的有向邊。3、XY集合之間的邊都設為從A集合中的點到B集合之中的點,容量為1的有向邊。 求網路最大流,流量就是匹配數,所有滿流邊是一組可行解。 所以就解決了。 飛行員配對
網路流24題之圓桌問題
P3254 圓桌問題 題目描述 假設有來自m 個不同單位的代表參加一次國際會議。每個單位的代表數分別為ri (i =1,2,……,m)。 會議餐廳共有n 張餐桌,每張餐桌可容納ci (i =1,2,……,n)個代表就餐。 為了使代表們充分交流,希望從同一個單位來的代表不在同一個餐
洛谷 P2765 魔術球問題(網路流24題-最大流)
題意:中文題(lrj黑書上好像有這道題) 思路:這個題的建圖還真的是挺有意思的,我們把一個球拆成2個點a,b。 然後讓a點連S點,b點連T點,如果有兩個數的加和為平方數,那我們就用第一個數的a點連向第二個數的b點,這樣就有一條流直接流向匯點T 程式碼:(順便get了怎麼列印路徑,賦學習傳送門) #
poj 2104 主席樹板子題
講真這道題我感覺可以暴力 本篇部落格的意思是讓我們理解一下主席樹板子的具體實現細節 給予那些看懂了思路但是看不懂板子的人的一條小道 。。。其實就是主席樹亂講。。。。 表打我這個蒟蒻 > < #include<iostream> #i
【網路流24題】最小路徑覆蓋問題-二分圖匹配/最大流
傳送門:luogu P2764 最小路徑覆蓋問題 題解 結論: D A G
[網路流24題]餐巾計劃問題——費用流建模
餐巾計劃問題 不錯的建模題。 滿足餐巾需求之下,花費最小。可以想到費用流。 但是怎麼建模呢? 可以想到,因為N<=2000,而且一切的工作,洗刷,購買都和天有關係。 所以,肯定要把網路流中的點看做每一天。 比較麻煩的是,我們不好處理餐巾的乾淨和
[Luogu P2765] [網路流24題] 魔術球問題
洛谷傳送門 題目描述 假設有 n n n根柱子,現要按下述規則在這
網路流24題總結和題解P1251
P1251 餐巾計劃問題 首先費用流 這個題也不知道是不是我搞錯了 bzoj好像資料範圍不大對 是不是有網路流以外的做法 我也不得而知 這個題是個這樣的模型:點代表天 每個天有s種決策 就拆為s個點 構造分層圖 圖與圖之間連結操作邊(邊代表操作) 簡單來說叫做 第一類:決策拆點 難度評價 思維難度
網路流24題——圓桌問題
【問題分析】 二分圖多重匹配問題,可以用最大流解決。 【建模方法】 建立二分圖,每個單位為X集合中的頂點,每個餐桌為Y集合中的頂點,增設附加源S和匯T。 1、從S向每個Xi頂點連線一條容量為該單位人數的有向邊。 2、從每個Yi頂點向T連線一條容量為該餐桌容量的有向
網路流24題——試題庫問題
【問題分析】 二分圖多重匹配問題,用最大流解決。 【建模方法】 建立二分圖,每個題為X集合中的頂點,每個類別為Y集合中的頂點,增設附加源S和匯T。 1、從S向每個Xi連線一條容量為1的有向邊。 2、從每個Yi向T連線一條容量為該類別所需數量的有向邊。 3、如果一個題i
洛谷 P3355 騎士共存問題 (網路流24題)
思路: 聽說這題是最大流 / 最小割 (不會啊) 畫個圖可以知道,根據互相能到達的關係建圖,不存在奇環,即這個圖是二分圖。 然後求不能互相攻擊的騎士數量也就是求這張圖的最大獨立集。 所以答案
[網路流24題] 魔術球問題
Description 給定\(n(n\leq 55)\)個柱子,需要依次將編號為\(1,2,3...\)的球放上柱子,規定一個球能放上柱子當且僅當柱子為空或這個球的編號與柱子最上面球的編號的和為完全平方數。問最多能放幾個球。輸出方案。 Solution 先吐槽一句,網上用網路流寫的題解都tm太不詳細了,全是
[網路流24題-13]餐巾計劃問題
餐巾計劃問題 寫網路流寫的頭昏腦漲QAQ大概還是太菜了 比較有趣的建圖題 對於每一個點拆點拆成早晨和晚上分別為 i 和 i' 1. s -> i (r,p) 每天早晨可以買最多r條新餐巾 一條p分 2. s -> i' (r,0) 每天用剩下r條髒餐巾 沒有代價
[網路流24題-12]最小路徑覆蓋問題
最小路徑覆蓋問題 有點蠢。。。結論題。。。(還是魔術球問題的一個部分) DAG最小路徑覆蓋直接拆點建二分圖然後頂點數-最大匹配就可以了。。。 其他相關結論見魔術球問題(大霧) 大體相當於“找出路”。 蠢蠢的還RE了一發QAQ 附程式碼。 #include<cst