網路流24題 數字梯形問題 luogu 4013

2022-05-25 17:36:13 字數 1573 閱讀 9951

題目描述:這裡

極其裸的一道費用流問題

然後將出入點之間的流量設為1,邊權設為0,這樣就有效保證了乙個點只經過一次

接下來,我們從上一行的出點向下一行的入點連邊,容量為1,費用為下一行對應點的代價的相反數,然後建起超級源點與超級終點,分別向第一行的入點連邊,容量1費用0,由最後一行出點向終點連邊,容量1費用0,跑一遍費用流即可(就是套路的最大費用流)

然後看第二問,發現點可以重複經過,這樣就不用拆點了,但邊不能重複走,所以我們不拆點,剩下的建邊與上面相同

但是注意:兩條路徑可以相交於最後一行,這樣的話如果最後一行的點向匯點連邊的容量為1是不夠的,所以設的容量要大於等於2

第三問就是把除了源點到第一行的邊以外的邊邊權全改為正無窮即可

#include #include 

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

const ll inf=0x3f3f3f3f3f3f3f3fll;

struct

edge

edge[

10005

];int head[1005

];int nnum[55][55

];ll a[

55][55

];ll dis[

1005

];int pre[1005

];int fa[1005

];ll lim[

1005

];bool used[1005

];int cnt=1

;int tot=0

;int

st,ed;

intn,m;

void

init()

void add(int l,int

r,ll w,ll v)

int ide(int

x)bool

spfa()

}used[u]=0

; }

return pre[ed]!=-1;}

ll ek()

}return

minv;

}int

main()

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

if(i==n)

else}}

printf(

"%lld\n

",-ek());

init();

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

if(i==n)

else}}

printf(

"%lld\n

",-ek());

init();

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

if(i==n)

else}}

printf(

"%lld\n

",-ek());

return0;

}

網路流24題 數字梯形問題

網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這絕對是我見過最不要臉的網路流了,一道題竟然赤裸裸的讓你建三個圖,算了,還是耐著性子把它做完了。我們首先要想明白的問題就是如果兩條路徑沒有任何公共點,那麼這兩條路徑一定不會相交,因為這...

網路流24題 數字梯形問題

題面 傳送門思路 三合一題目 但是實際上做好了第乙個就沒有別的問題了 第一問 把每個數字拆成兩個點,中間連一條容量為1,費用為0的邊,以此達到限制每個點流量的目的 然後其餘的不多說,源點到第一層,每一層向下連,最後一層到匯點 第二問 第一問中每個點內部的那條邊容量改成inf就好 第三問 直接dp算了...

網路流 24 題 數字梯形

題目描述 給定乙個由 n n n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m m m 個數字。從梯形的頂部的 m m m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。分別遵守以下規則 從梯形的頂至底的 m m m 條路徑互不相交 從梯形的頂至底的 m m ...