isap最大流

捉摸了好几天,终于在弄清楚了一点isap的算法~

isap就是改进的dinic算法,进行了重贴标签的运算,并且加入了gap优化,以及当前弧的优化,从而大大提升运算速度。具体分析已经在之前的转载的文章中分析过了。下面是链接

我是链接~

这是我的代码~(标注!的为第二次写的时候需要注意的部分)

#include<bits/stdc++.h>
#define maxn 3000000
using namespace std;

struct Edge
{
   int to,w,next;
}edge[maxn];

int n,m,s,t;
int head[maxn],gap[maxn],h[maxn],cur[maxn];

int cnt=0;

void add(int a,int b,int c)
{
   edge[cnt].w=c;
   edge[cnt].to=b;
   edge[cnt].next=head[a];
   head[a]=cnt++;
}

int  isap(int x,int fr)
{
    if(x==t)
       return fr;
    int rest=0;
    for(int i=cur[x];~i;i=edge[i].next)
    {
	    int j=edge[i].to;
	    if(h[j]+1==h[x]&&edge[i].w)//!
	     {
		    int f=isap(j,min(edge[i].w,fr-rest));
		    edge[i].w-=f;
		    edge[i^1].w+=f;
		    rest+=f;
		    if(rest==fr)  return fr;
		    if(edge[i].w) cur[x]=i;
		 }
	}
	--gap[h[x]];
	if(!gap[h[x]]) h[s]=n+2;//!
	h[x]++;gap[h[x]]++;//进行重贴标签
	cur[x]=head[x];
	return rest;
}

int main()
{
   int ans=0;
   memset(head,-1,sizeof(head));
   cin>>n>>m>>s>>t;
   while(m--)
   {
      int t1,t2,t3;
      cin>>t1>>t2>>t3;
      add(t1,t2,t3);add(t2,t1,0);
   }
   for(int i=0;i<n;i++)
     cur[i]=head[i];
    while(h[s]<n+2)
      ans+=isap(s,1e9);
    cout<<ans<<endl;
   return 0;
}
时间: 2024-10-05 06:30:23

isap最大流的相关文章

ISAP 最大流 最小割 模板

虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<algorithm> #define ll long long using namespace std; #define REP( i , a , b ) for ( int i = a ; i < b ; ++ i ) #d

POJ 3281 Dining

ISAP最大流...果粉专用的最大流 Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9573   Accepted: 4417 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John

ZOJ2587 Unique Attack

最小割判断唯一 先跑最大流,然后分别对源点和汇点DFS,记录能到达的点. 如果所有的点都能到达则最小割唯一,否则最小割有多解 Unique Attack Time Limit: 5 Seconds      Memory Limit: 32768 KB N supercomputers in the United States of Antarctica are connected into a network. A network has a simple topology: M differ

最大流isap模板

isap+bfs初始化+栈优化,点的编号从0开始: 1 const int MAXN = 100010; 2 const int MAXM = 400010; 3 const int INF = 0x3f3f3f3f; 4 struct Edge 5 { 6 int to, next, cap, flow; 7 }edge[MAXM]; 8 int tol; 9 int head[MAXN]; 10 int gap[MAXN], dep[MAXN], cur[MAXN]; 11 void ini

POJ 1459 Power Network(ISAP 裸最大流)

题目链接:http://poj.org/problem?id=1459 注意输入格式就行,还是ISAP #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> const int N = 210; const int maxn = 300; const int ma

HDU 1532Drainage Ditches(最大流模板题 ISAP)

Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11306    Accepted Submission(s): 5328 Problem Description Every time it rains on Farmer John's fields, a pond forms over Bessie'

POJ 3281 Dining(最大流建图 &amp;&amp; ISAP &amp;&amp; 拆点)

题目链接:http://poj.org/problem?id=3281 努力练建图ing!!! 题意:有 N 头牛,有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料. 第2行-第N+1行.是牛i 喜欢A种食物,B种饮料,及食物种类列表和饮料种类列表. 问最多能使几头牛同时享用到自己喜欢的食物和饮料.->最大流. 本题难点是建图: 思路:一般都是左边一个集合表示源点与供应相连,右边一个集合表示需求与汇点相连. 但是本题,牛作为需求仍然是一个群体,但是供

HDU 3549 Flow Problem (最大流ISAP)

Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 8199    Accepted Submission(s): 3814 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, yo

最大流-最小割 MAXFLOW-MINCUT ISAP

简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理解,对于每条反向边,我们流过它相当于撤销了一条正向边的流量. 并且它是必须的: 而且从理论上,我们在加入反向边之后得到的最大流,我们从残余网络考虑. 我们要认识到,反向边不会使最大流流量减少,这是很显然的.有flow<=flow'. 接下来我们考虑所有点的流量是否可以只用正向边得到. 并且我们考察汇