為什麼這樣是對的呢?這裡我自己還是沒分析出來,借用大佬們的思路吧。
建邊容量的選擇
因為網路流中是允許0流的,所以我們將所有元素減1,對應每行之和就是減c,每列減r,中間最大容量就是0~19,輸出時加一即可。
模型建立的選擇
這樣建模是常用的矩陣建模之一,學習學習~
首先,每個x節點只有乙個入流,多個出流,出流之和等於入流,也就是第i行之和;每個y節點有多個入流,只有乙個出流,入流之和等於出流,也就是第i列之和。
再考慮每一類弧的意義:第一類弧,以每一行所有元素之和為容量;第三類弧,以每一列所有元素之和為容量;第二類弧,最終流量為矩陣中的每乙個元素。也就是說,第一類弧分成多個分支,每乙個第一類弧都分出乙個分支匯到同乙個第三類弧。再考慮矩陣:把每一行的和分成多個元素,每一行的和都會分出乙個元素排列在同一列,組成這一列的和。其中有很大的相似性,其實就是問題的變形,只要求出每乙個第二類弧的流量,就是求出了矩陣中的每乙個元素。
演算法實現的選擇
這裡我還重溫了dinic演算法,之前都是看模板,自己建模應用時還是有問題的。
為什麼用dinic呢?dinic會用dfs遍歷層次圖,直到形成阻塞流,而此題就要求必須每個從s—t的網路流都必須滿載,這樣就可以用dinic構造的阻塞流判斷每個流的cap是否等於flow,如果是,輸出每個第二類弧的流量,如果否就是無解.
#include
#include
#include
#define maxn 1000
using
namespace
std;
const
int inf=0x3f3f3f3f;
struct edge
};struct dinic
bool bfs()}}
return vis[t];
}int dfs(int x,int a)
}return flow;
}bool oka()
return
true;
}bool okb(int r,int c)
return
true;
}void maxflow(int t,int r,int c)
cout
<<"matrix "
return
0;}
網路流 5 UVA 11082 最大流
網路流題目最有意思的地方就是構圖了,畢竟套模板每個人都會的 現在有乙個矩陣,已知前i行元素之和a i 1 i n 前j列元素之和b j 1 j m 求乙個可行的矩陣,且矩陣每個元素在區間 1,20 內。這也算是含上下界的網路流了,但是顯然,如果將每個元素都減一,就是普通的最大流了,矩陣元素值在區間 ...
網路流強化 UVA10480
做這道題,自己先是想了好幾種找被割的邊的方法 都被否決了。後來發現是最小割 只要一條邊的兩端在不同的點集裡面就代表是被割掉的滿流邊 這些滿流邊的流量和等於最大流的流量與最小割的權值和 但是之前自己想了乙個例子,10111 4343 3323 45 10056 1006 710072 1001 810...
網路流 最大流 uva1660 最小點割
非常非常裸的題目 但還是想了好久 點上有權值的題目可以考慮拆點解決 劉汝佳 記住這句話可以說非常有用,一開始還考慮到點邊互換上去了。有兩個注意點 1.不用列舉所有點對,確定乙個點之後,對於冥冥中確定但不知道在 的最小割點集,另外的點都可以分為這個點一邊的和另一邊的,列舉一圈就好了。2.源點取拆出來的...