UVa11082 矩陣解壓 網路流學習

2021-08-25 14:50:21 字數 1168 閱讀 6239

為什麼這樣是對的呢?這裡我自己還是沒分析出來,借用大佬們的思路吧。

建邊容量的選擇

因為網路流中是允許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.源點取拆出來的...