hdu 3549 Flow Problem(最大流模板题)
生活随笔
收集整理的這篇文章主要介紹了
hdu 3549 Flow Problem(最大流模板题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3549
For each test case, the first line contains two integers N and M, denoting the number of vertexes and edges in the graph. (2 <= N <= 15, 0 <= M <= 1000)
Next M lines, each line contains three integers X, Y and C, there is an edge from X to Y and the capacity of it is C. (1 <= X, Y <= N, 1 <= C <= 1000)
Output For each test cases, you should output the maximum flow from source 1 to sink N. Sample Input 2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1 Sample Output Case 1: 1 Case 2: 2
代碼例如以下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 32;//點數的最大值 const int MAXM = 1017;//邊數的最大值 const int INF = 0x3f3f3f3f; struct Edge {int to, cap, flow;int next; }edge[MAXM];//注意是MAXM int tol; int head[MAXN]; int dep[MAXN],pre[MAXN],cur[MAXN]; int gap[MAXN];//gap[x]=y :說明殘留網絡中dep[i]==x的個數為y void init() {tol = 0;memset(head,-1,sizeof (head)); } //加邊,單向圖三個參數。雙向圖四個參數 void addedge (int u,int v,int w,int rw=0) {edge[tol].to = v;edge[tol].cap = w;edge[tol].next = head[u];edge[tol].flow = 0;head[u] = tol++;edge[tol].to = u;edge[tol].cap = rw;edge[tol]. next = head[v];edge[tol].flow = 0;head[v]=tol++; } //輸入參數:起點、終點、點的總數 //點的編號沒有影響,僅僅要輸入點的總數 int sap(int start,int end, int N) {memset(gap,0,sizeof(gap));memset(dep,0,sizeof(dep));memcpy(cur,head,sizeof(head));int u = start;pre[u] = -1;gap[0] = N;int ans = 0;int i;while(dep[start] < N){if(u == end){int Min = INF;for( i = pre[u];i != -1; i = pre[edge[i^1]. to]){if(Min > edge[i].cap - edge[i]. flow)Min = edge[i].cap - edge[i].flow;}for( i = pre[u];i != -1; i = pre[edge[i^1]. to]){edge[i].flow += Min;edge[i^1].flow -= Min;}u = start;ans += Min;continue;}bool flag = false;int v;for( i = cur[u]; i != -1;i = edge[i].next){v = edge[i]. to;if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]){flag = true;cur[u] = pre[v] = i;break;}}if(flag){u = v;continue;}int Min = N;for( i = head[u]; i != -1; i = edge[i]. next){if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min){Min = dep[edge[i].to];cur[u] = i;}}gap[dep[u]]--;if(!gap[dep[u]]) return ans;dep[u] = Min+1;gap[dep[u]]++;if(u != start) u = edge[pre[u]^1].to;}return ans; } int main() {int n, m;int a, b, w;int c, s, t;int i;int T;int cas = 0;scanf("%d",&T);while(T--){init();//初始化 scanf("%d%d",&n,&m);for(i = 1; i <= m; i++)//邊數{scanf("%d%d%d",&a,&b,&w);addedge(a,b,w,0);// addedge(b,a,w,0);}int ans = sap(1, n, n);printf("Case %d: %d\n",++cas,ans);}return 0; }轉載于:https://www.cnblogs.com/brucemengbm/p/6846246.html
總結
以上是生活随笔為你收集整理的hdu 3549 Flow Problem(最大流模板题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拦截器、过滤器、@Aspect 区别
- 下一篇: Android 自动检测更新,自动下载a