網路流二十四題之數字梯形問題

2021-08-18 12:17:37 字數 2506 閱讀 2306

這道題的建模過程需要按照三個要求分開建模:

規則一:每條路徑不相交:

因為每條路徑不相交,所以每個每個節點只能經過一次。所以我們拆點x,y,順便將每個點都標號:

1.源點向第一層的x集合連一條邊,費用為0,容量為1.最後一層的y集合向匯點連一條邊,容量為1,費用為0;

2.x集合中的每乙個點xi,向y集合中的點yi連一條邊,容量為1,權值為i點的點權,代表每個點只能選一次

3.每個y集合中的點yi,向x集合的點xj連一條邊,如果j在i的下方或者右下方。

之後跑最大費用流,費用即是答案

規則二:可以在點處交叉:

這次不需要拆點,因為乙個點可以經過多次,相當於最長路了

1.源點向第一層的每個點連一條邊,容量1,費用0;

2.最後一層點的向匯點連一條邊,容量inf,費用為該點權。

3.每一層中的點向下一層的點連一條邊,容量為1,費用為點權。代表了只向下一層輸送乙個點的點權。

之後同樣跑一次最大費用流。

規則三:可以在任意點交叉

這個意思其實就是每個點接受的流量可能來自任何乙個點,那麼問題就簡單了,在上面的基礎上,將層與層連線的邊容量變成inf就行。

最大費用流其實不必要重寫費用流,只要將權值取相反數就行

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 100000;

const

int maxm = 100000;

const

int inf = 0x3f3f3f3f;

struct edge

edge[maxm];

int head[maxn],tol;

int pre[maxn],dis[maxn];

bool vis[maxn];

int n;//節點總個數,節點編號從0~n-1

void init(int n)

void addedge(int u,int v,int cap,int cost)

bool spfa(int s,int t)

dis[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty())}}

}if(pre[t] == -1)

return

false;

else

return

true;

}//返回的是最大流,cost存的是最小費用

int mincostmaxflow(int s,int t,int &cost)

for(int i = pre[t]; i != -1; i = pre[edge[i^1].to])

flow += min;

}return flow;

}void print_all()

}int id[1001][1001];

int a[1001][1001];

int main()

}int st = 0,en = cnt * 2+1;

init(cnt * 2+ 2);

for(int i = 1; i <= m; i++)

for(int i = 1; i<=n + m -1; i++)

for(int i = 1; i<=n; i++)}}

int ans1,cost1 = 0;

ans1 = mincostmaxflow(st,en,cost1);

printf("%d\n",-cost1);

init(cnt +2);

st = 0,en = cnt +1;

for(int i = 1; i<=m; i++)

for(int i = 1; i<=n + m -1; i++)

for(int i = 1; i<=n; i++)}}

int ans2,cost2 = 0;

ans2 = mincostmaxflow(st,en,cost2);

printf("%d\n",-cost2);

init(cnt +2);

st = 0,en = cnt +1;

for(int i = 1; i<=m; i++)

for(int i = 1; i<=n + m -1; i++)

for(int i = 1; i<=n; i++)}}

int cost3 = 0;

int ans3 = mincostmaxflow(st,en,cost3);

printf("%d\n",-cost3);

return0;}

/*2 2 1

1 3 0 1 2

1 3 1 2 -1

*/

網路流二十四題

開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...

網路流二十四題之航空路線問題

這道題的建模很有意思 1.首先每個點,除了起點,都向拆點後的點練一天容量1,費用 1的邊,代表只能走一次,負費用是為了求最大的費用,也就是最多的經過點。對於起點,容量變成2,費用不變。2.其次對於一天航線,終點在拆點後的點集向起點連一條邊,容量無限,費用為0,代表兩個城市可以達到。之後一次費用流,如...

網路流二十四題之騎士共存問題

終於把這個系列刷完了,雖然還有幾道題沒有搞定,但是在建模上已經有了長足的進步。這道題的建模和之前的方格取數有點像,同樣先將棋盤染色。1.源點向白色塊連線一條邊,容量為1,黑色塊向匯點連線一條邊,容量為1.2.對於所有的白塊,向它能走到的地方連一條邊,容量為1 然後求乙個最大流,又可以走的點減去最大流...