发烧了好几天才弄懂;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
using namespace std;
#define maxn 202
const int inf=0x7fffffff;
int dis[maxn],pre[maxn],map[maxn][maxn];
int num[maxn];
int n,src,des;
void bfs() //记录从汇点到源点的距离。
{
for(int i=1;i<=n;i++)
num[i]=0,dis[i]=n;
queue<int>q;
q.push(des);
dis[des]=0;
num[0]=1;
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=1;i<=n;i++)
if(dis[i]==n&&map[i][k]>0)
{
dis[i]=dis[k]+1;
q.push(i);
num[dis[i]]++; //此为距离为dis【i】的个数。
}
}
}
int findarc(int i)
{
for(int j=1;j<=n;j++)
if(map[i][j]>0&&dis[i]==dis[j]+1)
return j;
return -1;
}
int relable(int i) //此为当道这点没有允许弧,找到从这点出发的距离的最小值来更新dis【i】,
{
int mindis=n;
for(int j=1;j<=n;j++)
if(map[i][j]>0)
mindis=mindis<dis[j]?mindis:dis[j];
return mindis;
}
int sap()
{
bfs();
int maxflow=0,i=src,j,k;
int d;
pre[src]=-1;
while(dis[src]<n)
{
j=findarc(i);
if(j>=0)
{
pre[j]=i;
i=j;
if(i==des)
{
d=inf;
for(k=des;k!=src;k=pre[k])
d=d<map[pre[k]][k]?d:map[pre[k]][k];
for(k=des;k!=src;k=pre[k])
{
map[pre[k]][k]-=d;
map[k][pre[k]]+=d;
}
maxflow+=d;
i=src;
}
}
else
{
--num[dis[i]];
if(num[dis[i]]==0) return maxflow;
int x=relable(i);
dis[i]=x+1;
num[dis[i]]++;
if(i!=src) i=src;
}
}
return maxflow;
}
int main()
{
freopen("Input.txt","r",stdin);
int ncase;
while(~scanf("%d%d",&ncase,&n))
{
int a,b,c;
memset(map,0,sizeof(map));
des=n;src=1;
while(ncase--)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]+=c;
}
int tt=sap();
printf("%d\n",tt);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#define maxn 505
#define inf 0x7fffffff
int pre[maxn],head[maxn],dis[maxn],num[maxn];
struct tt
{
int adj;
int w;
int next;
int re;
}edge[maxn];
int top;
void init(int u,int v,int w)
{
edge[++top].adj=v;
edge[top].w=w;
edge[top].next=head[u];
head[u]=top;
edge[top].re=top+1;
edge[++top].adj=u;
edge[top].w=0;
edge[top].next=head[v];
edge[top].re=top-1;
head[v]=top;
}
int MIN(int a,int b)
{
return a>b?b:a;
}
void sap(int n)
{
memset(num,0,sizeof(num));
memset(dis,0,sizeof(dis));
num[0]=n;
int u=1,flow=inf,ans=0;
while(dis[1]<n)
{
while(1)
{
bool flag=false;
for(int j=head[u];j!=-1;j=edge[j].next)
{
int i=edge[j].adj;
if(edge[j].w>0&&dis[u]==dis[i]+1)
{
flow=MIN(flow,edge[j].w);
pre[i]=j;
u=i;
if(i==n)
{
ans+=flow;
while(i!=1)
{
u=pre[i];
edge[u].w-=flow;
edge[edge[u].re].w+=flow;
i=edge[edge[u].re].adj;
}
u=1;
flow=inf;
}
flag=true;break;
}
}
if(!flag) break;
}
int Min=n;
for(int j=head[u];j!=-1;j=edge[j].next)
if(edge[j].w>0&&dis[edge[j].adj]<Min)
Min=dis[edge[j].adj];
--num[dis[u]];
if(num[dis[u]]==0) break;
dis[u]=Min+1;
num[dis[u]]++;
if(u!=1) u=edge[edge[pre[u]].re].adj;
}
printf("%d\n",ans);
}
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
memset(head,-1,sizeof(head));
top=-1;
int a,b,c;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
init(a,b,c);
}
sap(n);
}
return 0;
}