網路流24題 16 數字梯形問題

2021-08-18 07:47:46 字數 1809 閱讀 1562

【問題描述】: 

給定乙個由 n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m 個數字。從梯形的頂部的 m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。 

規則1:從梯形的頂至底的m條路徑互不相交。 

規則2:從梯形的頂至底的m條路徑僅在數字結點處相交。 

規則3:從梯形的頂至底的m條路徑允許在數字結點相交或邊相交。 

【程式設計任務】:

對於給定的數字梯形,分別按照規則1,規則2,和規則 3 計算出從梯形的頂至底的 m條路徑,使這 m條路徑經過的數字總和最大。 

plan1:   拆點,原點a與新點a'之間連一條流量1費用為數字的邊,上層點b'向下層點a連一條流量1費用0的邊,超級匯點s向第一層連邊,最下面一層向t連邊(流量1費用0),跑最大費用流。

plan2:  可以相交,就說明點可以重複訪問,a與a'之間連邊流量改為inf就行了,其餘同plan1相同。

plan3:  就是從第一層每個點跑到t的最長路的和,為了方便,直接將與s或t不關聯的邊流量改為inf就行了。

貼**

#include#include#include#include#include#include#include#include#includeusing namespace std;

const int n=1605;

int n,m,a,b,c,d,e,cnt,s,t,full,k;

int inside[n],dist[n],times[n];

int fa[n][2],ans=0,mem[45][45];

struct sss;

vector map[n];

struct node;

inline int read()

while(t>='0'&&t<='9')

return u*k;

}inline void link(int a,int b,int c,int d)

); map[b].push_back((sss));

}inline bool spfa(int s,int t,int fan)

for(int i=e-n-m+2;i<=e;i++)link(i,i+e,1,mem[n][i+n+m-e-1]),link(i+e,t,1,0);

while(spfa(s,t,-1))add();cout/part 2:

memset(map,0,sizeof(map));ans=0;full=e+2;s=e+1;t=e+2;

for(int i=1;i<=m;i++)link(s,i,1,mem[1][i]);

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

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

for(int i=e-n-m+2;i<=e;i++)link(i,t,23333,0);

while(spfa(s,t,-1))add();cout/part 3:

for(int i=1;i<=m;i++)link(s,i,1,mem[1][i]);

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

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

for(int i=e-n-m+2;i<=e;i++)link(i,t,23333,0);

while(spfa(s,t,-1))add();cout<

return 0;

}

網路流24題16 數字梯形問題

給定乙個由 n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m 個數字。從梯形的頂部的 m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。規則 1 從梯形的頂至底的 m條路徑互不相交。規則 2 從梯形的頂至底的 m條路徑僅在數字結點處相交。規則 3 從梯形的頂至...

網路流24題 數字梯形問題

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

網路流24題 數字梯形問題

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