题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532
最大流模板题;
EK:(复杂度为n*m*m);
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define INF 0xfffffff #define N 220 int maps[N][N], pre[N], ans; bool bfs(int s, int e) { memset(pre, 0, sizeof(pre)); queue<int>Q; Q.push(s); while(Q.size()) { int i = Q.front(); Q.pop(); if(i == e) return true; for(int j=1; j<=e; j++) { if(pre[j]==0 && maps[i][j] > 0) { pre[j] = i; Q.push(j); } } } return false; } void EK(int s, int e) { while(bfs(s, e)) { int Min = INF; for(int i=e; i!=s; i=pre[i]) Min=min(maps[pre[i]][i], Min); for(int i=e; i!=s; i=pre[i]) { maps[pre[i]][i]-=Min; maps[i][pre[i]]+=Min; } ans+=Min; } } int main() { int n, m, x, y,c; while(scanf("%d%d", &m, &n)!=EOF) { memset(maps, 0, sizeof(maps)); for(int i=1; i<=m; i++) { scanf("%d%d%d", &x, &y, &c); maps[x][y] += c; } ans = 0; EK(1, n); printf("%d ", ans); } return 0; }
Dinic:(复杂度为n*n*m)
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define N 220 #define INF 0xfffffff int n, ans, Head[N], cnt, Layer[N]; struct Edge { int v, flow, next; } e[2*N]; void Add(int u, int v, int flow) { e[cnt].v = v; e[cnt].flow = flow; e[cnt].next = Head[u]; Head[u] = cnt++; } bool bfs(int S, int E) { memset(Layer, 0, sizeof(Layer)); Layer[S] = 1; queue<int>Q; Q.push(S); int p, q; while(!Q.empty()) { p = Q.front(); Q.pop(); if(p == E)return true; for(int i=Head[p]; i!=-1; i=e[i].next) { q = e[i].v; if(!Layer[q] && e[i].flow) { Layer[q] = Layer[p]+1; Q.push(q); } } } return false; } int dfs(int u, int MaxFlow, int E) { if(u == E)return MaxFlow; int uflow=0; for(int i=Head[u]; i!=-1; i=e[i].next) { int v = e[i].v; if(Layer[v]==Layer[u]+1 && e[i].flow) { int flow = min(e[i].flow, MaxFlow - uflow); flow = dfs(v, flow, E); e[i].flow -= flow; e[i^1].flow += flow; uflow += flow; if(uflow==MaxFlow)break; } } if(uflow==0) Layer[u]=0; return uflow; } void Dinic() { while(bfs(1, n)) { ans+=dfs(1, INF, n); } } int main() { int a, b, flow, m; while(scanf("%d%d", &m, &n)!=EOF) { memset(Head, -1, sizeof(Head)); cnt = 0; for(int i=1; i<=m; i++) { scanf("%d%d%d", &a, &b, &flow); Add(a, b, flow); Add(b, a, 0); } ans = 0; Dinic(); printf("%d ", ans); } return 0; }