ff
#include <iostream>
#include <queue>
#include <map>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
#define INF 0x3ffffff
#define Max 10000
struct arctype
{
int c,f;//容量 流量
};
arctype edge[Max][Max];
int n,m;//定点个数 弧数
int flag[Max];//顶点状态 -1:未标号 0:已标号未检查 1:已标号已检查
int pre[Max];//指明标号从哪个顶点得到
int alpha[Max];//可改进量
queue<int>Q;
//int queue[Max];//队列
int v;//队列头元素
int qs,qe;//队列头,队列尾
void ford()
{
while(1)
{
memset(flag,-1,sizeof(flag));
memset(pre,-1,sizeof(pre));
memset(alpha,-1,sizeof(alpha));
while(!Q.empty()) Q.pop();
flag[0]=0;pre[0]=0;alpha[0]=INF;//标记源点
Q.push(0);
while(!Q.empty()&&flag[n-1]==-1)
{
v=Q.front();Q.pop();
for(int i=0;i<n;i++)
{
if(flag[i]==-1)
{
//正向且流量未满
if(edge[v][i].c<INF&&edge[v][i].f<edge[v][i].c)
{
flag[i]=0;pre[i]=v;
alpha[i]=min(alpha[v],edge[v][i].c-edge[v][i].f);
Q.push(i);
}
//反向且有流量
else if(edge[i][v].c<INF&&edge[i][v].f>0)
{
flag[i]=0;pre[i]=-v;
alpha[i]=min(alpha[v],edge[i][v].f);
Q.push(i);
}
}
}
flag[v]=1;
}
if(flag[n-1]==-1||alpha[n-1]==0) break;
int k1=n-1,k2=abs(pre[k1]);
int a=alpha[n-1];
//for(int i=0;i<n;i++) cout<<alpha[i]<<endl;
while(1)
{
if(edge[k2][k1].f<INF)
edge[k2][k1].f+=a;
else
edge[k1][k2].f-=a;
if(k2==0) break;
k1=k2;k2=abs(pre[k2]);
}
//cout<<"asdfg"<<a<<endl;
}
long long maxflow=0;//从源点出发求最大流量
for(int i=0;i<n;i++)
if(edge[0][i].f<INF)
{
maxflow+=edge[0][i].f;
//cout<<i<<edge[0][i].f<<endl;
}
cout<<maxflow<<endl;
}
int main()
{
int u,v,c,f;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
edge[i][j].c=edge[i][j].f=INF;
}
for(int i=1;i<=m;i++)
{
cin>>u>>v>>c>>f;
edge[u][v].c=c;
edge[u][v].f=f;
}
ford();
return 0;
}
dinic
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
#define min(a,b)(a<b?a:b)
#define INF 1000000
const int MAX=210;
struct Node
{
int c;
int f;
};
int sx,ex;//sx和ex分别代表源点和汇点
int pre[MAX];
Node map[MAX][MAX];
int n,m;
bool BFS()//BFS搜索层次网络
{
memset(pre,0,sizeof(pre));
queue< int > Q;
Q.push(sx);
pre[sx]=1;
while(!Q.empty())
{
int d=Q.front();
Q.pop();
for(int i=1;i<=n;i++)
{
if(!pre[i]&&map[d][i].c-map[d][i].f)
{
pre[i]=pre[d]+1;
Q.push(i);
}
}
}
return pre[ex]!=0;
}
int dinic(int pos,int flow)//pos是顶点号,flow是当前顶点所能得到的流量
{
int f=flow;
if(pos==ex)
return flow;
for(int i=1;i<=n;i++)
{
if(map[pos][i].c-map[pos][i].f&&pre[pos]+1==pre[i])
{
int a=map[pos][i].c-map[pos][i].f;
int t=dinic(i,min(a,flow));
map[pos][i].f+=t;
map[i][pos].f-=t;
flow-=t;//我最开始就是这里没弄明白,我不明白为什么要此顶点得到的流量减去改变量;答案就在下面的 return f-flow;
}
}
return f-flow;//其实这里返回给他前一层的就是这个t;因为t在层函数里面都有,所以所过避免重复就写成这样;
}
int slove()
{
int sum=0;
while(BFS())
{
sum+=dinic(sx,INF);
}
return sum;
}
int main()
{
int u,v,w;
while(cin>>m>>n)
{
sx=1;
ex=n;
memset(map,0,sizeof(map)) ;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
map[u][v].c+=w;
}
cout<<slove()<<endl;
}
return 0;
}