有源匯上下界最小流 BZOJ 2502 清理雪道

2021-08-07 15:32:36 字數 1803 閱讀 7216

time limit: 10 sec  memory limit: 128 mb

submit: 1039  solved: 561

[submit][status][discuss]

滑雪場坐落在

fj省西北部的若干座山上。

從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡(即雪道),弧的方向代表斜坡下降的方向。

你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。

由於每次飛行的耗費是固定的,為了最小化耗費,你想知道如何用最少的飛行次數才能完成清理雪道的任務。

輸入檔案的第一行包含乙個整數

n(2 <= n

<= 100) – 

代表滑雪場的地點的數量。接下來的

n行,描述

1~n號地點出發的斜坡,第

i行的第乙個數為

mi(0 <= mi

< n) 

,後面共有

mi個整數,由空格隔開,每個整數

aij互不相同,代表從地點

i下降到地點

aij的斜坡。每個地點至少有乙個斜坡與之相連。

輸出檔案的第一行是乙個整數k– 

直公升飛機的最少飛行次數。

81 3

1 72 4 5

1 81 8

02 6 504

題意就是給你乙個拓撲圖,每條邊流量下限為1

有乙個原點可以向每個點流流量,問最小流多少

這裡我們就來解決這個有源匯上下界最小流問題

先跑出可行流

但可行流不一定最小(可以隨手yy)

那麼我們如何搞掉多餘的流量呢

考慮由s->t的過程是增廣

由t->s的過程就是對s->t的流的縮減(感性/理性理解)

所以在得到可行流後

做t->s的最大流 並將其從答案減去就好了

注意:

在我們求解可行流的過程中,應用新源匯對所有點連邊

此題中特殊在於源匯沒有流量限制,所以連不連無所謂

第二遍跑dinic是在殘量網路上跑

不能跑完之後用邊權和求最大流

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

typedef long long ll;

inline int read()

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

return x*f;

}void print(int x)

const int n=210,m=100100,inf=0x3f3f3f3f;

int ecnt=1,last[n];

struct edgee[m];

inline void readd(int u,int v,int val)

;last[u]=ecnt;}

inline void add(int u,int v,int val)

int in[n];

int n,ans;

int s=n-2,t=n-1;

int d[n],q[n];

bool bfs(int s,int t)/*8

1 31 7

2 4 5

1 81 8

02 6 504

*/

有源匯上下界最小流 模板

這只是 其中一種 做法 這只是其中一種做法 這只是其中一 種做法 我暫時還沒有理解,只是先放個模板而已 首 先還 是根據下 界來建圖 原圖源 點s,匯 點t 首先還是根據下界來建圖,原圖源點s,匯點t 首先還是根據 下界來建 圖,原圖 源點s,匯點t 然 後因 為流量守 恆,新建 超級源s 1和超級...

117 有源匯有上下界最小流

題目描述 n nn 個點,m mm 條邊,每條邊 e ee 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s ss 與匯點 t tt,求源點到匯點的最小流。輸入格式 第一行兩個正整數 n nn m mm s ss t...

有源匯有上下界最大 最小流

建圖還是要想一想的.寫一下吧 首先根據有源匯可行流建圖,正向附加邊滿流證明有可行流 然後在這個殘量網路上刪掉 t,s,oo 這條邊,跑 s t 最大流就是最大流,t s 最大流就是最小流 include define int long long define ll long long define ...