CDOJ 1143 传输数据

来源:互联网 发布:虚拟机mac打开本地 编辑:程序博客网 时间:2024/06/08 03:22
最大流

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <string>#include <fstream>#include <list>#include <stack>#include <queue>#include <deque>#include <algorithm>#include <map>#include <set>#include <vector>using namespace std;//ISAP+bfs 初始化+栈优化#define maxn 205//点数的最大值#define maxm 410//边数的最大值#define INF 0x3f3f3f3fstruct Edge{int to, next, cap, flow;}edge[maxm];//注意是maxmint tol;int head[maxn];int gap[maxn], dep[maxn], cur[maxn];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].flow = 0;edge[tol].next = head[u]; head[u] = tol++;edge[tol].to = u; edge[tol].cap = rw; edge[tol].flow = 0;edge[tol].next = head[v]; head[v] = tol++;}int Q[maxn];void BFS(int start, int end){memset(dep, -1, sizeof(dep));memset(gap, 0, sizeof(gap));gap[0] = 1;int front = 0, rear = 0;dep[end] = 0;Q[rear++] = end;while (front != rear){int u = Q[front++];for (int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (dep[v] != -1)continue;Q[rear++] = v;dep[v] = dep[u] + 1;gap[dep[v]]++;}}}int S[maxn];//N是总顶点数,编号[0,N-1]int sap(int start, int end, int N){BFS(start, end);memcpy(cur, head, sizeof(head));int top = 0;int u = start;int ans = 0;while (dep[start] < N){if (u == end){int Min = INF;int inser;for (int i = 0; i < top; i++)if (Min > edge[S[i]].cap - edge[S[i]].flow){Min = edge[S[i]].cap - edge[S[i]].flow;inser = i;}for (int i = 0; i < top; i++){edge[S[i]].flow += Min;edge[S[i] ^ 1].flow -= Min;}ans += Min;top = inser;u = edge[S[top] ^ 1].to;continue;}bool flag = false;int v;for (int 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] = i;break;}}if (flag){S[top++] = cur[u];u = v;continue;}int Min = N;for (int 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[S[--top] ^ 1].to;}return ans;}int main(){//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);//ios::sync_with_stdio(false);//cin.tie(0); cout.tie(0);//ifstream in;//in.open("input.txt", ios::in);int n, m;scanf("%d%d", &m, &n);int s, e, c;init();for (int i = 0; i < m; ++i){scanf("%d%d%d", &s, &e, &c);--s; --e;addedge(s, e, c);}int ans = sap(0, n - 1, n);printf("%d\n", ans);//while (1);return 0;}

0 0
原创粉丝点击