【題目描述】
有一天,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最大...