LightOJ 1153 (网络流最大流 sap)
2015-07-19 19:12
579 查看
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> const int MAXN = 10010;//点数的最大值 const int MAXM = 10010;//边数的最大值 const int INF = 0x3f3f3f3f; struct Edge { int to,next,cap,flow; } edge[MAXM<<2]; //注意是MAXM int tol; int head[MAXN]; int gap[MAXN],dep[MAXN],pre[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].next = head[u]; edge[tol].flow = 0; head[u] = tol++; edge[tol].to = u; edge[tol].cap = w;///无向两边都流w edge[tol]. next = head[v]; edge[tol].flow = 0; head[v]=tol++; } //输入参数:起点、终点、点的总数 //点的编号没有影响,只要输入点的总数 int sap(int start,int end, int N) { memset(gap,0,sizeof(gap)); memset(dep,0,sizeof(dep)); memcpy(cur,head,sizeof(head)); int u = start; pre[u] = -1; gap[0] = N; int ans = 0; int i; while(dep[start] < N) { if(u == end) { int Min = INF; for( i = pre[u]; i != -1; i = pre[edge[i^1]. to]) { if(Min > edge[i].cap - edge[i]. flow) Min = edge[i].cap - edge[i].flow; } for( i = pre[u]; i != -1; i = pre[edge[i^1]. to]) { edge[i].flow += Min; edge[i^1].flow -= Min; } u = start; ans += Min; continue; } bool flag = false; int v; for( 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] = pre[v] = i; break; } } if(flag) { u = v; continue; } int Min = N; for( 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[pre[u]^1].to; } return ans; } int main() { int n,m,a,b,c,t; int start,end; while(~scanf("%d",&t)) { int cas=0; while(t--) { init(); scanf("%d",&n); scanf("%d%d%d",&start,&end,&m); for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); if(a!=b)//不建自环 addedge(a,b,c,0); } printf("Case %d: %d\n",++cas,sap(start,end,n)); } } return 0; }
相关文章推荐
- poj 1149 PIGS (网络流最大流Dinic)
- hdu 3549 Flow Problem ek算法,网络流
- 使用HttpClient访问网络
- HTTP返回状态码说明
- 计算机网络(二)
- 关于HttpServlet和Servlet以及doPost和doGet关系
- HTTP头部解释,HTTP头部详细分析,最全HTTP头部信息
- 基于 OpenFlow 实现网络虚拟化
- Http请求详解
- 网络安全文章list
- 网络安全文章list
- 关于 CentOS 7 网络设置
- 【NOI 2015网络同步赛】
- TCP/UDP服务器listen与recvfromd函数的顺序所致的问题
- CentOS 设置网络(修改IP&修改网关&修改DNS)
- queue_delayed_work和queue_work区别 (转http://blog.csdn.net/dosculler/article/details/7968101)
- Linux学习与总结:-4Linux网络设置
- TCP/IP协议的详细介绍
- C/C++ 用libcurl库进行http通讯网络编程
- C/C++ 用libcurl库进行http通讯网络编程