http://acm.hdu.edu.cn/showproblem.php?pid=6214
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int INF=0x3fffffff;
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 init(int n)
{
for (int i=0; i<=maxn ; 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);
d[s]=0;
vis[s]=1;
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];
}
int DFS(int x,int a)//x为当前节点,a为目前为止所有弧的最小流量
{
if(x==t||a==0)return a;
int 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,e.cap-e.flow)))>0)//下一层次加1并且残留量不为零
{
e.flow+=f;
edges[G[x][i]^1].flow-=f;
flow+=f;
a-=f;
if(a==0)break;
}
}
return flow;
}
int Maxflow(int s,int t)
{
this->s=s;
this->t=t;
int flow=0;
while(BFS())
{
memset(cur,0,sizeof(cur));
flow+=DFS(s,INF);
}
return flow;
}
};
Dinic dc,dc2;
int cut[maxn];
int vis[maxn];
int main()
{
int te;
scanf("%d",&te);
while(te--)
{
int s,t;
int n,m;
scanf("%d%d",&n,&m);
dc.init(n);
dc2.init(n);
scanf("%d%d",&s,&t);
for (int i=0; i<m; i++ )
{
int u,v,cap;
scanf("%d%d%d",&u,&v,&cap);
dc.AddEdge(u,v,cap*1005+1);
}
printf("%d\n",dc.Maxflow(s,t)%1005);
}
return 0;
}