标签:解题报告 soj3353 total flow 最大流
Description
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int MAXN = 210; const int MAXM = 10000; const int INF = 0x3f3f3f3f; struct Edge { int from, to, next, cap; }; Edge edge[MAXM]; int level[MAXN]; int head[MAXN]; int src, des, cnt; void addedge( int from, int to, int cap ) { edge[cnt].from = from; edge[cnt].to = to; edge[cnt].cap = cap; edge[cnt].next = head[from]; head[from] = cnt++; swap( from, to ); edge[cnt].from = from; edge[cnt].to = to; edge[cnt].cap = 0; edge[cnt].next = head[from]; head[from] = cnt++; } int bfs() { memset( level, -1, sizeof level ); cnt = 0; queue<int> q; while (!q.empty()) q.pop(); level[src] = 0; q.push( src ); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (edge[i].cap > 0 && level[v] == -1) { level[v] = level[u] + 1; q.push( v ); } } } return level[des] != -1; } int dfs( int u, int f ) { if (u == des) return f; int tem; for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (edge[i].cap > 0 && level[v] == level[u] + 1) { tem = dfs( v, min( f, edge[i].cap ) ); if (tem > 0) { edge[i].cap -= tem; edge[i^1].cap += tem; return tem; } } } level[u] = -1; return 0; } int Dinic() { int ans = 0, tem; while (bfs()) { while ((tem = dfs( src, INF )) > 0) { ans += tem; } } return ans; } int main() { int n; src = 'A', des = 'Z'; while (cin >> n) { memset( head, -1, sizeof head ); cnt = 0; char a, b; int c; for (int i = 1; i <= n; i++) { cin >> a >> b >> c; addedge( a, b, c ); //把节点数留够,直接用字符的ASCII码作为编号 } cout << Dinic() << endl; } return 0; }
标签:解题报告 soj3353 total flow 最大流
原文地址:http://blog.csdn.net/maxichu/article/details/45307365