日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HIT 2634 How to earn more

發(fā)布時間:2024/1/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HIT 2634 How to earn more 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HIT_2634

? ? 將S和項目相連,容量為收益,將人和T相連,容量為雇傭的花費,然后將項目和所需的人連起來,容量為INF。實際上我們最后需要的一個結(jié)果就是這個圖的割:從S出發(fā)能到達的點就是我們要做的項目和雇傭的人,能夠到達T的點就是不必做的項目和不必雇傭的人。

? ? 因為割對應(yīng)的是不做某些項目以及雇傭某些人,反映的類似“損失”的概念,因此要讓這部分“損失”最小,因此求原圖的最小割即可。

#include<stdio.h> #include<string.h> #include<algorithm> #define MAXD 210 #define MAXM 20310 #define INF 0x3f3f3f3f int M, N, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM]; int S, T, SUM, d[MAXD], q[MAXD], work[MAXD]; void add(int x, int y, int z) {v[e] = y, flow[e] = z;next[e] = first[x], first[x] = e ++; } void init() {int i, j, x, n;scanf("%d%d", &M, &N);S = 0, T = M + N + 1;memset(first, -1, sizeof(first[0]) * (T + 1));e = 0;SUM = 0;for(i = 1; i <= M; i ++){scanf("%d", &x), SUM += x;add(S, i, x), add(i, S, 0); }for(i = 1; i <= N; i ++){scanf("%d", &x);add(M + i, T, x), add(T, M + i, 0);}for(i = 1; i <= M; i ++){scanf("%d", &n);for(j = 0; j < n; j ++){scanf("%d", &x);add(i, M + 1 + x, INF), add(M + 1 + x, i, 0);}} } int bfs() {int i, j, rear = 0;memset(d, -1, sizeof(d[0]) * (T + 1));d[S] = 0, q[rear ++] = S;for(i = 0; i < rear; i ++)for(j = first[q[i]]; j != -1; j = next[j])if(flow[j] && d[v[j]] == -1){d[v[j]] = d[q[i]] + 1, q[rear ++] = v[j];if(v[j] == T) return 1; }return 0; } int dfs(int cur, int a) {if(cur == T)return a;int t;for(int &i = work[cur]; i != -1; i = next[i])if(flow[i] && d[v[i]] == d[cur] + 1)if(t = dfs(v[i], std::min(a, flow[i]))){flow[i] -= t, flow[i ^ 1] += t;return t; }return 0; } int dinic() {int ans = 0, t;while(bfs()){memcpy(work, first, sizeof(first[0]) * (T + 1));while(t = dfs(S, INF))ans += t; }return ans; } void solve() {printf("%d\n", SUM - dinic()); } int main() {int t;scanf("%d", &t);while(t --){init();solve(); }return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的HIT 2634 How to earn more的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。