using namespace std; const int mod=1001; const LL inf = (LL)1e18; int n,m,S,T; struct Edge{ int from, to,cap,flow; }; struct Dinic{ int n, m, s, t; vector<Edge> edges; vector<int> G[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; void ClearAll(int n){ for(int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void AddEdge(int from, int to, int cap){ edges.push_back((Edge){from, to, cap, 0}); edges.push_back((Edge){to, from, 0, 0}); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BFS(){ memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; while(!Q.empty()) { int x = Q.front(); Q.pop(); for(int i = 0; i < G[x].size(); i++) { Edge& e = edges[G[x][i]]; if(!vis[e.to] && e.cap > e.flow) { vis[e.to] = 1; d[e.to] = d[x] + 1; Q.push(e.to); } } } return vis[t]; } LL DFS(int x, LL a){ if(x == t || a == 0) return a; LL flow = 0, f; for(int& i = cur[x]; i < G[x].size(); i++) { Edge& e = edges[G[x][i]]; if(d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, (LL)e.cap-e.flow))) > 0) { e.flow += f; edges[G[x][i]^1].flow -= f; flow += f; a -= f; if(a == 0) break; } } return flow; } LL Maxflow(int s, int t){ this->s = s; this->t = t; LL flow = 0; while(BFS()) { memset(cur, 0, sizeof(cur)); flow += DFS(s, inf); } return flow; } }g; int main(){ // freopen("input.txt","r",stdin); int t; scanf("%d",&t); while(t--){ g.ClearAll(maxn); scanf("%d%d",&n,&m); scanf("%d%d",&S,&T); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); g.AddEdge(u,v,w*mod+1); } int ans=g.Maxflow(S,T)%mod; printf("%d\n",ans); } return 0; }
|