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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

防卫

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

1048:2012-12-28 防衛(wèi)

時間限制:?
10000ms?
內(nèi)存限制:?
256000kB
描述

小敏和小燕是一對好朋友。

他們正在玩一種神奇的游戲,叫Minecraft。

Tech國和Mana國即將要開戰(zhàn)了,小敏帶領(lǐng)Tech國修建了許多的據(jù)點,據(jù)點之間有一些僅允許單向通行的道路。

小敏正在自信滿滿地準(zhǔn)備迎接Mana國的挑戰(zhàn)的時候,小燕無意間在遠(yuǎn)處發(fā)現(xiàn)了一大堆Creeper……

這個消息瞬間擊倒了小敏。無奈之下,小敏只能在據(jù)點上修建一些大炮,保護(hù)自己開戰(zhàn)的前線不被Creeper給摧毀。也就是說,要保證所有的Creeper在到達(dá)前線陣地之前,就已經(jīng)被大炮給斃了。

不過在不同的據(jù)點上修建大炮的費(fèi)用不一樣,小敏希望費(fèi)用最小。

沒有出去道路的據(jù)點是前線陣地,Creeper只能從遠(yuǎn)處進(jìn)入沒有進(jìn)來道路的據(jù)點,并且通過道路進(jìn)入其他的據(jù)點。


輸入
第一行兩個整數(shù)n和m。
接下來的一行有n個整數(shù),分別代表每個據(jù)點修建大炮的費(fèi)用。
接下來的m行,每行兩個整數(shù)x和y,分別代表有一條道路從x連到y(tǒng)。
輸出
一行一個整數(shù),表示最小滿足條件的費(fèi)用。
樣例輸入
4 41 1 1 11 31 42 32 4
樣例輸出
2
提示
對于100%的數(shù)據(jù),n<=1000,m<=6000


?「Solution」

最大流+拆點

「代碼」


#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #define maxn 20000 #define INF 1 << 30 using namespace std; struct E {int from, to, tab, next; }edge[maxn]; int dist[maxn], head[maxn], d[maxn], in[maxn], out[maxn], ans, s, t, tot, m, n;void add_edge(int u, int v, int f) {tot++;edge[tot].from = u, edge[tot].to = v, edge[tot].tab = f, edge[tot].next = head[u], head[u] = tot;tot++;edge[tot].from = v, edge[tot].to = u, edge[tot].tab = 0, edge[tot].next = head[v], head[v] = tot; }int dfs(int x, int low) {int a;if (x == t) return low;for (int i = head[x]; i != -1; i = edge[i].next)if (dist[edge[i].to] == dist[x] + 1 && edge[i].tab > 0 && (a = dfs(edge[i].to, min(low, edge[i].tab)))){edge[i].tab -= a, edge[i^1].tab += a;return a;}return 0; }int bfs() {int l, r, k;memset(dist, 0xff, sizeof(dist));dist[s] = 0;d[0] = 0, d[1] = s;l = 0, r = 1;while (l < r){k = d[++l];for (int i = head[k]; i != -1; i = edge[i].next)if (edge[i].tab > 0 && dist[edge[i].to] < 0) dist[edge[i].to] = dist[k] + 1, d[++r] = edge[i].to;}if (dist[t] > 0) return 1; else return 0; }void dinic() {ans = 0;while (bfs()) ans += dfs(s, INF); }int main() {int x, y, f;tot = -1;memset(head,0xff,sizeof(head));scanf("%d%d", &n, &m);s = 2 * n + 1, t = 2 * n + 2;for (int i = 1; i <= n; i++){scanf("%d", &f);add_edge(i, i+n, f);}for (int i = 1; i <= m; i++){scanf("%d%d", &x, &y);in[y]++, out[x]++;add_edge(x+n, y, INF);}for (int i = 1; i <= n; i++){if (in[i] == 0) add_edge(s, i, INF);if (out[i] == 0) add_edge(i+n, t, INF);}dinic();printf("%d\n", ans);return 0; }


總結(jié)

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

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