BZOJ2163 複雜的大門

2022-03-29 20:05:18 字數 1683 閱讀 8342

bzoj2163: 複雜的大門

你去找某bm玩,到了門口才發現要開啟他家的大門不是一件容易的事……

他家的大門外有n個站台,用1到n的正整數編號。你需要對每個站台訪問一定次數以後大門才能開啟。

站台之間有m個單向的傳送門,通過傳送門到達另乙個站台不需要花費任何代價。

而如果不通過傳送門,你就需要乘坐公共汽車,並花費1單位的錢。值得慶幸的是,任意兩個站台之間都有公共汽車直達。

現在給你每個站台必須訪問的次數fi,對於站台i,你必須恰好訪問fi次(不能超過)。

我們用u、v、w三個引數描述乙個傳送門,表示從站台u到站台v有乙個最多可以使用w次的傳送門(不一定要使用w次)。

值得注意的是,對於任意一對傳送門(u1,v1)和(u2,v2),如果有u1第一行包含兩個正整數n、m,意義見題目描述。第二行包含n個正整數,第i個數表示fi。

接下來有m行,每行有三個正整數u、v、w,表示從u到v有乙個可以使用w次的傳送門。

輸出一行乙個整數,表示開啟大門最少花費的錢數。

4 35 5 5 5

1 2 1

3 2 1

3 4 1

17有20%的資料滿足n≤10,m≤50;對於所有的w、fi,滿足1≤w,fi≤10。

有50%的資料滿足n≤1000,m≤10000。100%的資料滿足1≤n≤10000,1≤m≤100000;對於所有的u、v,滿足1≤u,v≤n,u≠v;對於所有的w、fi,滿足1≤w,fi≤50000。

以上的每類資料中都存在50%的資料滿足對於所有的w、fi,有w=fi=1。

題解here!

這個題乍一看好像沒有什麼思路。

最多使用$w$次?感覺像網路流。。。

我們可以先把模型轉換為計算最大使用傳送門的次數。

這不就是最大流嘛。。。

拆點沒的說。。。

對於每個$i$,拆成$i$和$i+n$,然後從$s$到$i$連一條流量為要求達到訪問次數的邊,$i+n$到$t$也連一條容量為要求達到訪問次數的邊。

然後對於每個傳送門,由$u$到$v+n$連容量為傳送門使用次數$w$的邊。

跑出最大流就是最大使用傳送門的次數。

然後用所有的點要求達到的訪問次數的總和減去最大流就好了。 

附**:

#include#include#include#include#define maxn 100010

#define max 999999999

using namespace std;

int n,m,s,t,c=2,sum=0;

int head[maxn],deep[maxn];

struct grapha[maxn<<1];

inline int read()

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

return date*w;

}inline void add(int u,int v,int w)

bool bfs()}}

return false;

}int dfs(int x,int limit)

else deep[v]=-1;}}

return cost;

}int dinic()

void work()

void init()

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

}int main()

BZOJ2163 複雜的大門

點這裡看題目。bzoj gg 了,所以鏈結在 dark 上面。題面 你去找某 bm 玩,到了門口才發現要開啟他家的大門不是一件容易的事 他家的大門外有 n 個站台,用 1 到 n 的正整數編號。你需要對每個站台訪問一定次數以後大門才能開啟。站台之間有 m 個單向的傳送門,通過傳送門到達另乙個站台不需...

BZOJ 2163 複雜的大門

題目傳送門 分析 這個好像和那道清理滑雪跑道好像啊。如果每個點都要訪問恰好fi次 然後邊不能超過w次 哦。上下界網路流 每個點拆成兩個,原點向複製點連上 f,f 的邊,複製點向可到達的原點連 0,w 的邊 由於公交可以到達每個點,相當於發配流量,每個點都可以停下,相當於直接流向終點 所以s向每個原點...

BZOJ1171 大sz的遊戲

f i min f j 1,線段j與線段i有交,且l i l j l。線段j與線段i有交等價於y j x i x j y i 因為l i 遞增,所以可以維護乙個單調遞增的j,表示 j,i 1 範圍內都可以更新f i 用k d樹動態維護即可,時間複雜度 o n sqrt include include...