NOIP模擬 Snow(最大流)

2021-08-24 23:21:47 字數 1668 閱讀 3657

【題目描述】

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

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

我們用 u,v,w 三個引數描述乙個傳送門,表示從站台 u 到站台 v 有乙個最多可以使用 w 次的傳送門(不一定要使用 w 次)。對於任意一對傳送門 (u1,v1) 和 (u2,v2),如果有 u1tt 可以從任意的站台開始,從任意的站台結束。出發去開始的站台需要花費 1 單位的錢。現在請幫助 tt 求出開啟大門最少需要花費多少單位的錢。

【輸入格式】

第一行包含兩個正整數 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

【樣例輸出】

【資料範圍】

有 20% 的資料滿足 n≤10,m≤50;

有 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。

50分演算法:由題意可得,有50%的資料是w=fi=1,那麼就可用最小路徑覆蓋解決,用最大匹配即可,複雜度為o(n^2)

100分演算法:最大流,方法同50分演算法,將每條路徑的上限改為fi,答案為∑fi-maxflow,需加入當前弧優化。

貼**:

#includeusing namespace std;

const int maxn=1e6+10;

const int inf=0x3f3f3f3f;

int s,t;

int cnt;

int head[maxn],nxt[maxn],v[maxn],w[maxn],depth[maxn],cur[maxn];

bool bfs()

memset(depth,0,sizeof(depth));

depth[s]=1;

q.push(s);

do }while(!q.empty());

if(depth[t]==0)

return 0;

return 1;

}int dfs(int u,int dist)

} }return 0;

}int dinic()

return ans;

}void add(int a,int b,int c)

int main()

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

cout

}

NOIP模擬 最大化

乙個好像很經典的題目,但是之前沒打過。不過仔細想一想還是很容易的。首先很容易想到把這個表現為矩陣字首和的形式,然後就是要求這個大於0。然後就是乙個很經典的轉換套路了 本來是a k l a i 1 l a k j 1 a i 1 j 1 0 然後移一下項就變成了 a k l a i 1 l a k j...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...