#include <iostream> #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<algorithm> #include<vector> #include<map> using namespace std; const int N=405; const double esp=1e-8; int n,m; int head[N]; int tot; int INF=2e9+10; void init(){ memset(head,-1,sizeof head); tot=0; } struct Edge{ int to,w,nxt; }edge[N*2]; void addEdge(int u,int v,int w){ edge[tot].to=v; edge[tot].w=w; edge[tot].nxt=head[u]; head[u]=tot++; edge[tot].to=u;/*fanxiangbian*/ edge[tot].w=0; edge[tot].nxt=head[v]; head[v]=tot++; } int level[N]; int q[N]; void bfs(int s,int t){ memset(level,0,sizeof level); level[s]=1; int front=0,rear=1; q[front]=s; while(front < rear ){ int x=q[front++]; for(int k=head[x];~k;k=edge[k].nxt){ int v=edge[k].to,w=edge[k].w; if(!level[v] && w){ level[v]=level[x]+1; q[rear++]=v; } } } } int dfs(int u,int f,int t){ if(u==t) return f; int ret=0; for(int k=head[u];~k;k=edge[k].nxt){ int v=edge[k].to; int w=edge[k].w; if(level[u]+1==level[v] && f && w){ int dd=dfs(v,min(f,w),t); edge[k].w-=dd; edge[k^1].w+=dd; if(u!=1)f-=dd; ret+=dd; } } return ret; } int dinic(int s,int t){ int ret=0; while(true) { bfs(s,t); if(level[m]==0) break; ret+=dfs(s,INF,t); } return ret; } int main() { #ifndef ONLINE_JUGDE //freopen("aaa","r",stdin); #endif // ONLINE_JUGDE int T; while(~scanf("%d%d",&n,&m)){ init(); for(int i=0;i<n;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); addEdge(u,v,w); } } return 0; }