(網路流24題大多需要spj,所以需要乙個有spj的oj,本系列**均在www.oj.swust.edu.cn測試通過)
這絕對是我見過最不要臉的網路流了,一道題竟然赤裸裸的讓你建三個圖,算了,還是耐著性子把它做完了。
我們首先要想明白的問題就是如果兩條路徑沒有任何公共點,那麼這兩條路徑一定不會相交,因為這道題的路徑是定義在點之上的,當且僅當兩條路徑包含兩個相同的且上下相鄰的點時兩條路徑才有公共邊。
首先我們新建乙個s,乙個t。
s向第一層每乙個點連一條容量為1,費用為0的邊,最後一層向匯點連一條容量為1,費用為0的邊。
對於規律一,不許有路徑點或者邊相交只要把每個點都拆分為兩個點讓每個點都只可經過一次,費用為該點權值即可完成。
對於規律二,只需在節點處相交,只要把兩個點重新合併為乙個點,每條路徑的容量設定為1,費用設為其上方點的權值即可(這樣交點的權值可以多次計算,而且還不會發生邊的重複)。
對於規律三,既可點相交,又可邊相交,只要去掉所有變得容量限制(除s到第一層的邊)既可。
建三遍圖跑三遍最大費用最大流即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define inf 100000000
struct bian
a[1000000];
int fir[1000000];
int nex[1000000];
int tot=1;
void add_edge(int l,int r,int f,int v)
int s=0,t=9999;
int dis[10000];
bool pd[100000];
int fro[10000];
bool spfa()
}pd[u]=false;
}if(dis[t]==0x8f8f8f8f) return
false;
return
true;
}int cost;
int add_flow()
mid=t;
while(mid!=s)
cost+=temp*dis[t];
return temp;
}int v[100][100];
int n,m;
inline
int wz(int x,int y)
void jiabian1()
for(int i=1;i<=m;i++)
for(int j=1;j<=n+i-1;j++)
else
add_edge(wz(i,j)*2,wz(i,j)*2+1,1,v[i][j]);
add_edge(wz(i,j)*2+1,wz(i,j)*2,0,-v[i][j]);
}}void jiabian2()
for(int i=1;i<=m;i++)
for(int j=1;j<=n+i-1;j++)
else
}}void jiabian3()
for(int i=1;i<=m;i++)
for(int j=1;j<=n+i-1;j++)
else
}}int main()
網路流24題 數字梯形問題
題面 傳送門思路 三合一題目 但是實際上做好了第乙個就沒有別的問題了 第一問 把每個數字拆成兩個點,中間連一條容量為1,費用為0的邊,以此達到限制每個點流量的目的 然後其餘的不多說,源點到第一層,每一層向下連,最後一層到匯點 第二問 第一問中每個點內部的那條邊容量改成inf就好 第三問 直接dp算了...
網路流 24 題 數字梯形
題目描述 給定乙個由 n n n 行數字組成的數字梯形如下圖所示。梯形的第一行有 m m m 個數字。從梯形的頂部的 m m m 個數字開始,在每個數字處可以沿左下或右下方向移動,形成一條從梯形的頂至底的路徑。分別遵守以下規則 從梯形的頂至底的 m m m 條路徑互不相交 從梯形的頂至底的 m m ...
網路流24題 數字梯形問題 費用流
洛谷傳送門 loj傳送門 勞資把 spfa 裡 cost 陣列初始化從 1 改成 inf 就特麼 a 了,梯形裡有負數,浪費了半個多小時,心態都崩了 問題難度好像是反過來的 源點向第一排的點都流量為 1 費用為 0 的邊,最後一排的點向匯點連流量為 1 費用為 0 的邊 第三問點點之間流量 inf ...