Problem Description
Each case describes a network G , and the first line contains two integers n (2≤n≤200) and m (0≤m≤1000) indicating the sizes of nodes and edges. All nodes in the network are labelled from 1 to n .
The second line contains two different integers s and t (1≤s,t≤n) corresponding to the source and sink.
Each of the next m lines contains three integers u,v and w (1≤w≤255) describing a directed edge from node u to v with capacity w .
Output
Sample Input
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<sstream> #include<cctype> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI=acos(-1.0); const double eps=1e-6; const int INF=0x3f3f3f3f; const int maxn=9876; int T; int n,m,s,t; int ans,flag,tot; int head[maxn],path[maxn],vis[maxn]; struct Edge { int from,to; int cap; int next; }e[maxn]; void init() { tot=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(path,0,sizeof(path)); } void add_edge(int u,int v,int w) { e[tot].from=u; e[tot].to=v; e[tot].cap=w; e[tot].next=head[u]; head[u]=tot++; } int bfs() { queue<int>q; q.push(s); vis[s]=1; path[s]=-1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; if(e[i].cap>0&&!vis[v]) { path[v]=i; vis[v]=1; if(v==t) return 1; q.push(v); } } } return 0; } int EK() { int maxFlow=0; int flow,i; while(bfs()) { memset(vis,0,sizeof(vis)); i=path[t]; flow=INF; while(i!=-1) { flow=min(flow,e[i].cap); i=path[e[i].from]; } i=path[t]; while(i!=-1) { e[i].cap-=flow; e[i^1].cap+=flow; i=path[e[i].from]; } maxFlow+=flow; } return maxFlow; } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); init(); scanf("%d%d",&s,&t); for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add_edge(a,b,c*1000+1); add_edge(b,a,0); } printf("%d\n",EK()%1000); } return 0; }