开long long的最大流

#include<bits/stdc++.h>
using namespace std;
const long long MAXN = ;//点数的最大值
const long long MAXM = ;//边数的最大值
const long long INF = 1e15 + ;
struct Edge
{
long long to,next,cap,flow;
} edge[MAXM]; //注意是MAXM
long long tol;
long long head[MAXN];
long long gap[MAXN],dep[MAXN],cur[MAXN];
long long n, m, s, t;
void init()
{
tol = ;
memset(head,-,sizeof(head));
}
void addedge(long long u,long long v,long long w,long long rw = )
{
edge[tol].to = v;
edge[tol].cap = w;
edge[tol].flow = ;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].to = u;
edge[tol].cap = rw;
edge[tol].flow = ;
edge[tol].next = head[v];
head[v] = tol++;
}
long long Q[MAXN];
void BFS(long long start,long long end)
{
memset(dep,-,sizeof(dep));
memset(gap,,sizeof(gap));
gap[] = ;
long long front = , rear = ;
dep[end] = ;
Q[rear++] = end;
while(front != rear)
{
long long u = Q[front++];
for(long long i = head[u]; i != -; i = edge[i].next)
{
long long v = edge[i].to;
if(dep[v] != -)
continue;
Q[rear++] = v;
dep[v] = dep[u] + ;
gap[dep[v]]++;
}
}
}
long long S[MAXN];
long long sap(long long start,long long end,long long N)
{
BFS(start,end);
memcpy(cur,head,sizeof(head));
long long top = ;
long long u = start;
long long ans = ;
while(dep[start] < N)
{
if(u == end)
{
long long Min = INF;
long long inser; for(long long i = ; 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(long long i = ; i < top; i++)
{
edge[S[i]].flow += Min;
edge[S[i]^].flow -= Min;
}
ans += Min;
top = inser;
u = edge[S[top]^].to;
continue;
}
bool flag = false;
long long v;
for(long long i = cur[u]; i != -; i = edge[i].next)
{
v = edge[i].to;
if(edge[i].cap - edge[i].flow && dep[v]+ == dep[u])
{
flag = true;
cur[u] = i;
break;
}
}
if(flag)
{
S[top++] = cur[u];
u = v;
continue;
}
long long Min = N;
for(long long i = head[u]; i != -; 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 + ;
gap[dep[u]]++;
if(u != start)
u = edge[S[--top]^].to;
}
return ans;
}
int main(){
init();
scanf("%lld %lld %lld %lld", &n , &m, &s, &t);
for(long long i = ; i < m; i++){
long long u, v, w;
scanf("%lld %lld %lld", &u, &v, &w);
addedge(u,v,w);
}
printf("%lld\n", sap(s,t,n));
}

最新文章

  1. objective-c中的@selector()和 c /c++的函数指针
  2. Spark:一个高效的分布式计算系统
  3. Jmeter组件3. HTTP Cookie Manager
  4. 基础学习day11--多线程一线程的创建,运行,同步和锁
  5. Gradle dsl method not found renderscriptSupportMode()
  6. topcoder SRM 592 DIV2 LittleElephantAndPermutationDiv2
  7. asp.net 奇淫技巧
  8. 射频识别技术漫谈(10)&mdash;&mdash;识别号的格式变化【worldsing笔记】
  9. bzoj3571: [Hnoi2014]画框 最小乘积匹配+最小乘积XX总结,
  10. Invocation of init method failed; nested exception is org.hibernate.HibernateException: could not instantiate RegionFactory [org.hibernate.cache.impl
  11. 80x86汇编小站站长简单介绍
  12. 字符串的长度超过了为 maxJsonLength 属性设置的值
  13. Charles Proxy代理使用简要说明
  14. 设计模式五: 原型模式(Prototype)
  15. crowdstrike提供的应急响应工具
  16. Bootstrap各种进度条的实例讲解
  17. dwr出现session error
  18. python(九)迭代器和生成器
  19. vue去掉#——History模式
  20. jquery有几种选择器?

热门文章

  1. python之三级菜单
  2. Linux下无图形界面安装Matlab
  3. pom文件jar包缺失问题
  4. java程序员应该知道的20个有用的库
  5. 8.对于.NET的初步理解和介绍
  6. Java基础:(七)反射
  7. 【TensorFlow入门完全指南】模型篇&#183;线性回归模型
  8. 微软Bot Framework文档中,关于Sign-in Card的一处代码错误及更正
  9. MFC【exe】工程中的文件大致信息(翻译的)
  10. 使用nginx搭建一个简单的负载均衡