CDOJ 1143 传输数据 最大流
2016-07-31 15:45
302 查看
最大流
#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 0x3f3f3f3f struct Edge { int to, next, cap, flow; }edge[maxm];//注意是maxm int 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; }
相关文章推荐
- cdoj 1143 传输数据 最大流
- UESTC 1143 传输数据 网络流 最大流 Dinic
- UESTC 1143 数据传输 网络流 最大流 Dinic
- WCF代码设置最大传输数据
- 如何在ADO.NET Data Service的解决方案中修改最大传输数据量
- 客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成
- 关于MySQL允许最大传输数据
- 小程序报错数据传输长度为 xxx 已经超过最大长度 xxx
- Android BLE中传输数据的最大长度怎么破
- 如何在ADO.NET Data Service的解决方案中修改最大传输数据量
- Android BLE中传输数据的最大长度怎么破
- JavaScript在页面间数据传输的使用
- {技术.SQL.ACCESS.EXCEL.FOXPRO} SQLServer和Access、Excel数据传输简单总结
- 使用 Visual C# .NET 向 Microsoft Excel 2002 传输 XML 数据
- 新型D.o.S(伪造TCP连接进行数据传输的D.o.S)
- 用c#编写通过无线网(例如CDMA)传输数据的通信程序
- webservice对"小"规模数据传输的效率问题
- JavaScript在页面间数据传输的使用
- Data Transfer Object(数据传输对象) [转载]
- SQLServer和Access、Excel数据传输简单总结