上下界網路流 bzoj2502 清理雪道

2022-05-20 03:32:29 字數 2256 閱讀 7225

模型:無源匯有上下界可行流ljn:模板題吧

滑雪場坐落在fj省西北部的若干座山上。

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

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

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

輸入檔案的第一行包含乙個整數n (2 <= n

<= 100) – 代表滑雪場的地點的數量。接下來的n行,描述1~n號地點出發的斜坡,第i行的第乙個數為mi

(0 <= mi

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

互不相同,代表從地點i下降到地點aij

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

輸出檔案的第一行是乙個整數k – 直公升飛機的最少飛行次數。

題目的限制相當於這樣額外連邊:對於$(u,v)$若$u$在原圖上可到達$v$,那麼存在一條$(v,u)$的費用為1的邊。現在求使每條邊至少經過一次的(流量守恆的)可行流。

這個模型就是最小費用無源匯有上下界可行流(迴圈流)。參考:

有上下界的網路流學習筆記。

這裡提供一幅簡單的圖供以理解。

先在原圖中跑一趟最大流,將邊(tt,ss)的流量作為初始答案。再在此增廣的基礎上,刪去s,t和邊(tt,ss),並以tt為超級源、ss為超級匯跑一趟最大流。答案即是初始答案減去第二次的最大流。第二次在割去(tt,ss)之後之所以還有流量,是因為tt沿著反向弧向ss方向更新了最大流量。

可以這麼說:因為整張圖滿足流量平衡,所以tt點流入的流量=流出的流量。而tt沿著反向弧向ss方向更新的最大流量,就是ss到tt減少最多的流量。因此兩者相減就是全圖的最小流。

或許這個操作叫做無源匯最小流?

1 #include2

const

int maxn = 203;3

const

int maxm = 200035;4

const

int inf =2e9;56

struct

edge710

}edges[maxm];

11int

n,s,t,ss,tt,ans;

12int

edgetot,head[maxn],nxt[maxm],lv[maxn];

1314

intread()

1524

void addedge(int u, int v, int

c)25

29bool

buildlevel()

3044}45

}46return

false;47

}48int fndpath(int x, int

lim)

49else lv[v] = -1;59

}60}61

return0;

62}63int

dinic()

6470

intmain()

7183}84

addedge(tt, ss, inf);

85dinic();

86 ans = -edges[edgetot-1

].f;

87for (int i=head[s]; i!=-1; i=nxt[i]) edges[i].c = edges[i^1].c = edges[i].f = edges[i^1].f = 0;88

for (int i=head[t]; i!=-1; i=nxt[i]) edges[i].c = edges[i^1].c = edges[i].f = edges[i^1].f = 0

;89 edges[edgetot-1].f = edges[edgetot-2].f = edges[edgetot-1].c = edges[edgetot-2].c = 0

;90 s = tt, t =ss;

91 ans -=dinic();

92 printf("

%d\n

",ans);

93return0;

94 }

end

BZOJ 2502 清理雪道 上下界網路流

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

bzoj2502 清理雪道 上下界網路流

滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行...

bzoj2502 清理雪道 有上下界的網路流

發現了一種不錯的最小流求法。有源匯的最小流 源點s向每個點連一條容量為 0,inf 的邊 每個點向匯點t連一條容量為 0,inf 的邊 原圖的每條邊變成容量為 1,inf 的邊 最小流求法 二分乙個答案,每次在s到t間連一條容量為 0,x 的邊 判斷是否可行 include include incl...