#include<cstdio> #include<cstring> #include<queue> #define maxn 5005 using namespace std; int n,m,ans; int be[maxn],ne[maxn],to[maxn],e=0,w[maxn];//链表 int d[maxn];//记录搜索深度 int read(){ int c=getchar(),fg=1,sum=0; while(c>'9'||c<'0'){ if(c=='-') fg=-1;//如果是负数 c=getchar(); } while(c<='9'&&c>='0'){ sum=sum*10+c-'0'; c=getchar(); } return fg*sum; } void add(int x,int y,int z){ to[e]=y;//边e要到达的节点 ne[e]=be[x]; be[x]=e; w[e]+=z;//边e的最大流量 e++; } int bfs(){ memset(d,-1,sizeof(d)); queue<int> q; q.push(n),d[n] = 0; while(!q.empty()){//队列非空 int u=q.front();//取队头 q.pop();//弹出队头 for(int i=be[u];i!=-1;i=ne[i]){ int v=to[i]; if(w[i^1]&&d[v]==-1){ d[v]=d[u]+1; q.push(v); } } } return d[1]!=-1;//可以连通 } int dfs(int x,int flow){ if(x==n)//已经搜到汇点 return flow; int k;//增加的可以通过的流量 for(int i=be[x];i!=-1;i=ne[i]){ int v=to[i]; if(w[i]&&d[v]==d[x]-1){//保证不出环 k=dfs(v,min(flow,w[i]));//min保证可行性 if(k>0){ w[i]-=k; w[i^1]+=k;//^可以直接取到相反的边 return k; } } } return 0; } int main(){ scanf("%d%d",&m,&n); memset(be,-1,sizeof(be)); for(int i=1;i<=m;i++){ int x,y,z; x=read(),y=read(),z=read(); to[e]=y;//边e要到达的节点 ne[e]=be[x]; be[x]=e; w[e]+=z;//边e的最大流量 e++; to[e]=x;//边e要到达的节点 ne[e]=be[y]; be[y]=e; e++; } int k; while(bfs()){ k=dfs(1,1e7); ans+=k; } printf("%d",ans); return 0; }