#include<iostream>
#include<stdio.h>
using namespace std;
int const inf = 1<<30;
struct Edge
{
int u,v,c,next;
}edge[500];
int e;
int n,m;
int pre[210],cur[210],dis[210],gap[210],head[210];
void add_edge(int u,int v,int c)
{
edge[e].u = u;
edge[e].v = v;
edge[e].c = c;
edge[e].next = head[u];
head[u] = e++;
edge[e].u = v;
edge[e].v = u;
edge[e].c = 0;
edge[e].next = head[v];
head[v] = e++;
}
int sap(int s,int t)
{
int flow=0,aug=inf,u;
bool flag;
for(int i=0; i<n; i++)
{
cur[i]=head[i];
gap[i]=dis[i]=0;
}
gap[s]=n;
u=pre[s]=s;
while(dis[s]<n)
{
flag=0;
for(int &j=cur[u]; j!=-1; j=edge[j].next)
{
int v=edge[j].v;
if(edge[j].c>0&&dis[u]==dis[v]+1)
{
flag=1;
if(edge[j].c<aug) aug=edge[j].c;
pre[v]=u;
u=v;
if(u==t)
{
flow+=aug;
while(u!=s)
{
u=pre[u];
edge[cur[u]].c-=aug;
edge[cur[u]^1].c+=aug;
}
aug=inf;
}
break;
}
}
if(flag) continue;
int mindis=n;
for(int j=head[u]; j!=-1; j=edge[j].next)
{
int v=edge[j].v;
if(edge[j].c>0&&dis[v]<mindis)
{
mindis=dis[v];
cur[u]=j;
}
}
if((--gap[dis[u]])==0)
return flow;
gap[dis[u]=mindis+1]++;
u=pre[u];
}
return flow;
}
int main()
{
int a,b,c;
while(~scanf("%d%d",&m,&n))
{
e = 0;
memset(head,-1,sizeof(head));
for (int i = 0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add_edge(a-1,b-1,c);
}
printf("%d\n",sap(0,n-1));
}
}
第一次写,学习了新的网络流算法 sap算法
一开始看懂了 sap算法 的具体的思想,借鉴了颜大牛的代码经过n次WA后终于发现了是建错图了 汗!~~~~
以后要注意~~~