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

2021-08-19 13:57:33 字數 1576 閱讀 2746

先講一下這道題的邊相交指的是連續兩次走到同乙個點。

第一問:如果點不想交顯然邊也不相交,所以我們只要把每個點拆成兩個點,中間連流量為1,費用為這給點的貢獻的邊,s連第一行,最後一行連t,第i行連第i+1行,費用為0,流量為inf,最大費用最大流跑一發就行了。

第二問:每個點可以走多次,但是每條邊只能走一次,所以把拆點省略,行與行之間連的流量變為1就行了,至於貢獻,把這個點的貢獻設為入邊的費用就行了,s到第一行的費用為第一行的貢獻,流量仍為1,最後一行到t的費用為0,注意流量要改為inf,因為每個點可以作為終點多次,因為貢獻在倒數第二行流過來的時候算過了。

第三問:可以xjb流,所以把流量改為inf就行了,但是s到第一行的流量仍為1.

#include

#include

#include

#include

#include

#define ll long long

#define inf (2139062143)

#define n (105)

template void read(t&t)

do while (isdigit(p));

if (!fl) t=-t;

}int

m,n,tot,s,t,h,t,all,ans;

intmap[n][n],a[n*n],f[n*n],fare[n*n],nxt[n*n],head[n*n],q[n*n

<<2],dis[n*n],from[n*n];

bool vis[n*n];

inline void add(int

x,int

y,int z,int t)

inline int spfa()}}

vis[u]=0;

}return dis[t];

}int get(int

x,int

y)inline void work1()

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

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

while (spfa()!=dis[0])

} printf("%d\n",ans);

}void work2()

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

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

while (spfa()!=dis[0])

} printf("%d\n",ans);

}void work3()

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

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

while (spfa()!=dis[0])

} printf("%d\n",ans);

}int main()

}all=(m

*2+n-1)*n/2;

work1();

work2();

work3();

return

0;}

網路流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 ...