Pagini recente » Cod sursa (job #2531824) | Cod sursa (job #499883) | Cod sursa (job #1397569) | Cod sursa (job #2235142) | Cod sursa (job #868253)
Cod sursa(job #868253)
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
ifstream in1;
vector <int> g[1002];
int S,D,flux,M,N,x,y,T[1002],f[1002][1002],c[1002][1002];
int bfs()
{
int ok=0;
queue <int> q;
//memset(T,0,sizeof(T));
T[S]=-1;
q.push(S);
for(int nod;!q.empty();q.pop())
{
nod=q.front();
for(vector <int>::iterator it=g[nod].begin();it!=g[nod].end();++it)
if(T[*it]==0&&c[nod][*it]>f[nod][*it])
{
if(*it!=D)
{
T[*it]=nod;
q.push(*it);
}
else ok=1;
}
}
return ok;
}
void dinic()
{
while (bfs())
{
for(vector <int>::iterator it=g[D].begin();it!=g[D].end();++it)
if(T[*it]&&c[*it][D]>f[*it][D])
{
T[D]=*it;
int min=1<<31-1;
for(int nod=D;nod!=S;nod=T[nod])
if(min>c[T[nod]][nod]-f[T[nod]][nod])
min=c[T[nod]][nod]-f[T[nod]][nod];
if(min<=0) continue;
flux=flux+min;
for(int nod=D;nod!=S;nod=T[nod])
{
f[T[nod]][nod]=f[T[nod]][nod]+min;
f[nod][T[nod]]=f[nod][T[nod]]-min;
}
}
}
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
flux=0;
scanf("%d%d",&N,&M);
for(int i=1;i<=M;i++)
{
scanf("%d%d",&x,&y);
scanf("%d",&c[x][y]);
g[x].push_back(y);
g[y].push_back(x);
}
S=1;
D=N;
dinic();
printf("%d",flux);
return 0;
}