BZOJ2163 複雜的大門

2022-06-04 10:57:09 字數 2341 閱讀 4234

點這裡看題目。

bzoj gg 了,所以鏈結在 dark 上面。

題面:

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

他家的大門外有 \(n\) 個站台,用 \(1\) 到 \(n\) 的正整數編號。你需要對每個站台訪問一定次數以後大門才能開啟。站台之間有 \(m\) 個單向的傳送門,通過傳送門到達另乙個站台不需要花費任何代價。而如果不通過傳送門,你就需要乘坐公共汽車,並花費 \(1\) 單位的錢。值得慶幸的是,任意兩個站台之間都有公共汽車直達。

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

我們用 \((u,v,w)\) 三個引數描述乙個傳送門,表示從站台 \(u\) 到站台 \(v\) 有乙個最多可以使用 \(w\) 次的傳送門(不一定要使用 \(w\) 次)。值得注意的是,對於任意一對傳送門 \((u_1,v_1)\) 和 \((u_2,v_2)\),如果有 \(u_1,則有 \(v_1\le v_2\);如果有 \(v_1,則有 \(u_1≤u_2\);且 \(u_1=u_2\) 和 \(v_1=v_2\) 不同時成立。

你可以從任意的站台開始,從任意的站台結束。出發去開始的站台需要花費 \(1\) 單位的錢。你需要求出開啟大門最少需要花費多少單位的錢。

資料範圍:

對於 \(100\%\) 的資料,滿足 \(1\le n\le 10^4, 1\le m\le 10^5, 1\le w,f_i\le 5\times 10^4\) 。

粗看可以想到費用流的大致方向。

事實上,我們可以將一種方案描述成 \(n\) 個站台的可重排列 \(p\) ,並且第 \(i\) 個站台恰好出現 \(f_i\) 次。此時從 \(p_i\) 到達 \(p_\) 的費用僅與這兩個點有關,因此我們可以構建二分圖,左部表示 \(p_i\) ,右部表示 \(p_\) ,那麼匹配的費用就是從 \(p_\) 到達 \(p_i\) 的費用。實際上我們建圖幹的事情就是給每個 \(p_i\) 找到它的前驅

設左部的點為 \(l_1,l_2,...,l_\) ,右部為 \(r_1,r_2,...,r_n\) ,那麼不難想到如下建圖:

答案就是 \(s\) 到 \(t\) 的最大流,再加一。

小結:通過將序列拆分為當前點 \(p_i\) 和前驅 \(p_\) ,從而轉化為了二分圖,建圖方法有參考價值。

#include #include using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 1e5 + 5, maxm = 1e6 + 5;

templatevoid read( _t &x )

while( '0' <= s && s <= '9' )

x *= f;

}templatevoid write( _t x )

template_t min( const _t a, const _t b )

struct edge

graph[maxm << 1];

queueq;

int a[maxn];

int f[maxn];

int head[maxn], dist[maxn], cur[maxn];

int n, m, cnt = 1, tot;

bool vis[maxn];

void addedge( const int from, const int to, const int c, const int w )

void adde( const int from, const int to, const int c, const int w )

bool spfa( const int s, const int t )

} return dist[t] < inf;

}int dfs( const int u, const int lin, const int t, int &cost )

} if( used < lin ) dist[u] = inf;

vis[u] = false; return used;

}int dinic( const int s, const int t )

return c;

}int main()

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

adde( s, s, sig - 1, 0 );

write( dinic( s, t ) + 1 ), putchar( '\n' );

return 0;

}

BZOJ2163 複雜的大門

bzoj2163 複雜的大門 你去找某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...