最小費用最大流 JZOJ 4802 探險計畫

2022-04-30 19:45:10 字數 2409 閱讀 5628

description

這一天,hnsdfz資訊組的眾人決定上岳麓山玩.岳麓山上的可以探險的地方非常多,而資訊組的oier們給每乙個地方都設定了乙個危險值,代表探險這個景點需要承擔的危險,而整個岳麓山可以抽象為由n行數字組成的數字梯形.而梯形頂端有m個數字,在每個數字處可以往左上或右上移動 ( (i,j) 可以到 (i-1,j) 或 (i-1,j-1), (i,j)表示輸入檔案中數字梯形的第i行第j列 ),形成一條從梯形底至頂的路徑.

而一開始,每個人都覺得如果走過別人走過的地方就太沒個性了.於是有

任務一: 找出m條完全不相交的至底至頂的路徑. (不可以重複經過點, 也不可以重複經過邊)

但略一思考,又都覺得如果限定這麼死,那就太無趣了,於是有:

任務二: 找出m條僅在數字處相交的路徑. (可以重複經過點, 但不可以重複經過邊. 在山頂相遇也是允許的)

現在,做為整個瀏覽計畫的發起者,你要計算出對於任務一與任務二,每個人觀賞線路所能經受的最小危險. (所有人在所有地方獲得的危險值總和 最小)

input

第一行兩個正整數n,m.表示整個梯形有n行,第一行有m個列.

接下來n行描述整個數字梯形.第i行有n+i-1個數字.

output

分兩行輸出,分別是對應任務一與任務二的結果.

sample input

3 2

1 22 1 2

2 2 2 2

sample output

10

9樣例解釋

第i個數字表示每條路線在第i行走第幾個數字.

任務一的兩條路線 1 1 1;2 2 2;

任務二的兩條路線 1 2 2;2 2 3;

data constraint

對於 10% 的資料 n<=10;  m<=5;

對於100% 的資料 n<=80;  m<=80; 每個數字<=20;

看題,資料小,不難想到dp

然後想一下,dp的複雜度很高(根本不能打好不好!)

然後發現點邊被限制經過次數,就想到了最小費用流

我們把數字拆成入點和出點,費用為原數字,流量要看是哪個任務,任務1則為1,任務2則為無限

然後向上下可到達的點連邊,費用0,流量1

對於任務1,與源匯的邊流量為1,任務2則為無限

然後要判斷增廣次數,最多為m次

點數較多,需要用zkw,這裡偷懶開了o2直接ek睡過去了

#pragma gcc optimize(2)#include 

#include

#include

#include

using

namespace

std;

const

int n=2e4+10

;const

int inf=2147483647

;struct

edge g[

5*n];

int cnt=1,list[n],a[200][200],b[200][200

],d[n],f[n];

bool

vis[n];

intn,m,s,t,ans,ans1;

void add(int u,int v,int w,int

c) ;list[u]=cnt;

g[++cnt]=(edge);list[v]=cnt;

}bool

bfs()

vis[u]=0

; }

return d[t]!=0x3f3f3f3f;}

void

mcf()

x=t;ans+=d[t];

while

(f[x])

}void

c_dinic()

}int

main()

t=t*2+1

;

for (int i=1;i<=m+n-1;i++) add(b[n][i]*2,t,0

,inf);

c_dinic();

ans1=ans;ans=0

; cnt=1;memset(list,0,sizeof

list);

for (int i=1;i<=m;i++) add(0,b[1][i]*2-1,0,1),add(b[1][i]*2-1,b[1][i]*2,a[1][i],1

);

for (int i=2;i<=n;i++)

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

for (int i=1;i<=m+n-1;i++) add(b[n][i]*2,t,0,1

); c_dinic();

printf(

"%d\n%d\n

",ans,ans1);

}

view code

最小費用最大流

網 絡流的基本問題為 設乙個有向賦權圖g v,e v 其中有兩個特殊的節點s和s s稱為發點,s 稱為收點。圖中各 邊的方向和權數表示允許的流向和最大可能的流量 容量 問在這個網路圖中從發點流出到收點匯集,最大可通過的實際流量為多少?流向的分布情況為怎樣?設有乙個網路圖g v,e v e中的每條邊 ...

最小費用最大流

const int maxn 250 const int maxm 62272 const int inf 0x4ffffff int n,m struct edge edge maxm int head maxn cnt void init void addedge int u,int v,int...

最小費用最大流

看了最小費用最大流的問題,感覺好難啊,想不到,關鍵就是想不到,知道模板什麼用,只是能a題僅此而已,要想學深真的不是件容易的事情啊。為此我總結了以下幾點供複習知識點或者是講課時用 網路流的費用 在實際應用中,與網路流有關的問題,不僅涉及流量,而且還有費用的因素。網路的每一條邊 v,w 除了給定容量ca...