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...