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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 4289(最小割最大流定理)

發布時間:2025/3/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 4289(最小割最大流定理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:有N個城市,現在城市S出現了一伙歹徒,他們想運送一些炸彈到D城市,不過警方已經得到了線報知道他們的事情,不過警察不知道他們所在的具體位置,所以只能采取封鎖城市的辦法來阻斷暴徒,不過封鎖城市是需要花費一定代價的,由于警局資金比較緊張,所以想知道如果完全阻斷暴徒從S城市到達D城市的最小需要花費的代價。

解題思路:這道題目還是難在建圖,如果我們仔細分析這道題的話,它要求的是最小的花費使得s點與d點不連通。。如果熟悉最小割最大流定理的話,那么這個題目又可以轉化到網絡流的問題上來。。此外,這道題目的費用是在頂點上,而普通的網絡流的容量都是在邊上,所以又是拆點,把每個點都拆成兩份,之間連一條費用邊。。。最后要求最小割就是求最大流。。好題!

AC:

#include<stdio.h> #include<algorithm> #include<queue> #include<string.h> using namespace std;const int MAXN = 505; const int oo = 1e8+7;struct Edge{int v, flow, next;}edge[MAXN*MAXN]; int Head[MAXN], cnt; int layer[MAXN];///分層void InIt() {cnt = 0;memset(Head, -1, sizeof(Head)); } void AddEdge(int u, int v, int flow) {edge[cnt].v = v;edge[cnt].flow = flow;edge[cnt].next = Head[u];Head[u] = cnt++;swap(u, v);edge[cnt].v = v;edge[cnt].flow = 0;edge[cnt].next = Head[u];Head[u] = cnt++; } bool bfs(int start, int End) {queue<int> Q;Q.push(start);memset(layer, 0, sizeof(layer));layer[start] = 1;while(Q.size()){int u = Q.front();Q.pop();if(u == End)return true;for(int j=Head[u]; j!=-1; j=edge[j].next){int v = edge[j].v;if(layer[v] == false && edge[j].flow){layer[v] = layer[u] + 1;Q.push(v);}}}return false; } int dfs(int u, int MaxFlow, int End) {if(u == End)return MaxFlow;int uflow = 0;for(int j=Head[u]; j!=-1; j=edge[j].next){int v = edge[j].v;if(layer[v]==layer[u]+1 && edge[j].flow){int flow = min(MaxFlow-uflow, edge[j].flow);flow = dfs(v, flow, End);edge[j].flow -= flow;edge[j^1].flow += flow;uflow += flow;if(uflow == MaxFlow)break;}}if(uflow == 0)layer[u] = 0;return uflow; } int dinic(int start, int End) {int MaxFlow = 0;while(bfs(start, End) == true)MaxFlow += dfs(start, oo, End);return MaxFlow; }int main() {int N, M;while(scanf("%d%d", &N, &M) != EOF){int i, u, v, cost, start, End;InIt();scanf("%d%d", &start, &End);for(i=1; i<=N; i++){scanf("%d", &cost);AddEdge(i, i+N, cost);}while(M--){scanf("%d%d", &u, &v);AddEdge(u+N, v, oo);AddEdge(v+N, u, oo);}printf("%d\n", dinic(start, End+N));}return 0; }

總結

以上是生活随笔為你收集整理的hdu 4289(最小割最大流定理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。