poj 1273 Drainage Ditches

来源:互联网 发布:贵州大数据局地址 编辑:程序博客网 时间:2024/04/20 10:29

题目大意:简单的最大流问题。。。

最大流入门题。

用Edmonds_karp算法,复杂度为O(VE2)

#include <iostream>#include <cstdio>#include <cstring>#include <climits>#include <queue>#include <algorithm>using namespace std;struct node{int u, v, flow, cap, next;};const int maxn = 210;int n, m, e, ans, head[maxn], store[maxn], path[maxn];node edge[maxn * 2];void addEdge(int u, int v, int val);bool Edmonds_karp();int main(){while(scanf("%d %d", &m, &n) != EOF){memset(head, -1, sizeof(head));e = 0;ans = 0;int u, v, val;for(int i = 0; i < m; i++){scanf("%d %d %d", &u, &v, &val);u--, v--;addEdge(u, v, val);}while(Edmonds_karp());printf("%d\n", ans);}return 0;}void addEdge(int u, int v, int val){edge[e].u = u;edge[e].v = v;edge[e].cap = val;edge[e].flow = 0;edge[e].next = head[u];head[u] = e++;edge[e].u = v;edge[e].v = u;edge[e].cap = 0;edge[e].flow = 0;edge[e].next = head[v];head[v] = e++;}bool Edmonds_karp(){int u, v;queue<int> que;memset(path, -1, sizeof(path));memset(store, 0, sizeof(store));store[0] = INT_MAX;que.push(0);while(!que.empty()){int index = que.front();que.pop();for(int i = head[index]; i != -1; i = edge[i].next){u = edge[i].u; v = edge[i].v;if(store[v] == 0 && edge[i].cap > edge[i].flow){path[v] = i;que.push(v);store[v] = min(store[u], edge[i].cap - edge[i].flow);}}}if(store[n - 1] == 0)return false;ans += store[n - 1];for(int i = path[n - 1]; i != -1;){edge[i].flow += store[n - 1];edge[i ^ 1].flow -= store[n - 1];i = path[edge[i].u];}return true;}
SAP算法,复杂度为O(V2E)
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <climits>using namespace std;struct node{int u, v, flow, cap, next;};const int maxn = 210;int n, m, e, ans, head[maxn], store[maxn], path[maxn], cur[maxn], cnt[maxn], height[maxn];node edge[maxn * 2];void addEdge(int u, int v, int val);void sap();int main(){while(scanf("%d %d", &m, &n) != EOF){memset(head, -1, sizeof(head));e = 0;ans = 0;int u, v, val;for(int i = 0; i < m; i++){scanf("%d %d %d", &u, &v, &val);u--, v--;addEdge(u, v, val);}sap();printf("%d\n", ans);}return 0;}void addEdge(int u, int v, int val){edge[e].u = u;edge[e].v = v;edge[e].cap = val;edge[e].flow = 0;edge[e].next = head[u];head[u] = e++;edge[e].u = v;edge[e].v = u;edge[e].cap = 0;edge[e].flow = 0;edge[e].next = head[v];head[v] = e++;}void sap(){int u, v, now;for(int i = 0; i < n; i++)cur[i] = head[i];memset(height, 0, sizeof(height));cnt[0] = n;store[0] = INT_MAX;u = 0;while(height[0] < n){for(now = cur[u]; now != -1; now = edge[now].next){v = edge[now].v;if(edge[now].cap != edge[now].flow && height[u] == height[v] + 1)break;}if(now != -1){cur[u] = now;path[v] = now;store[v] = min(store[u], edge[now].cap - edge[now].flow);u = v;if(u == n - 1){while(u != 0){edge[path[u]].flow += store[n - 1];edge[path[u] ^ 1].flow -= store[n - 1];u = edge[path[u]].u;}ans += store[n - 1];store[0] = INT_MAX;}}else{if(--cnt[height[u]] == 0)break;height[u] = n;cur[u] = head[u];for(now = cur[u]; now != -1; now = edge[now].next)            {                v = edge[now].v;                if(edge[now].cap > edge[now].flow && height[u] > height[v] + 1)                    height[u] = height[v] + 1;            }            cnt[height[u]]++;            if(u != 0)                u = edge[path[u]].u;}}}


原创粉丝点击