Pagini recente » Cod sursa (job #928092) | Cod sursa (job #817507) | Cod sursa (job #1125193) | Cod sursa (job #857388) | Cod sursa (job #2525167)
#include <bits/stdc++.h>
#define Inf 1000000001
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m,sum;
vector <int> gf[1001];
int cap[1001][1001],flux[1001][1001];
bitset <1001> viz;
queue <int> c;
struct muchie
{
int nod1,nod2;
bool tip;
};
muchie tree[1001],start[1001],drum[1001];
int t;
bool bfs()
{
for(int i=1;i<=n;i++)
viz[i]=0;
t=0;
viz[1]=1;
c.push(1);
while(!c.empty())
{
int nod=c.front();
c.pop();
if(cap[nod][n]-flux[nod][n]>0)
{
start[++t]={nod,n,0};
viz[n]=1;
continue;
}
else if(flux[n][nod]>0)
{
start[++t]={nod,n,1};
viz[n]=1;
continue;
}
for(auto vec:gf[nod])
if(!viz[vec])
{
if(cap[nod][vec]-flux[nod][vec]>0)
{
tree[vec]={nod,vec,0};
viz[vec]=1;
c.push(vec);
}
else if(flux[vec][nod]>0)
{
tree[vec]={nod,vec,1};
viz[vec]=1;
c.push(vec);
}
}
}
for(int i=1;i<=t;i++)
{
int nr=0;
drum[++nr]=start[i];
while(tree[ drum[nr].nod1 ].nod1)
drum[++nr]=tree[ drum[nr-1].nod1 ];
int minim=Inf;
for(int j=1;j<=nr;j++)
if(drum[j].tip==0)
minim=min(minim,cap[ drum[j].nod1 ][ drum[j].nod2 ]-flux[ drum[j].nod1 ][ drum[j].nod2 ]);
else
minim=min(minim,flux[ drum[j].nod2 ][ drum[j].nod1 ]);
for(int j=1;j<=nr;j++)
if(drum[j].tip==0)
flux[ drum[j].nod1 ][ drum[j].nod2 ]+=minim;
else
flux[ drum[j].nod2 ][ drum[j].nod1 ]-=minim;
sum+=minim;
}
return viz[n];
}
int main()
{
in>>n>>m;
for(int i,j,ct,k=1;k<=m;k++)
{
in>>i>>j>>ct;
cap[i][j]=ct;
gf[i].push_back(j);
gf[j].push_back(i);
}
while(bfs());
out<<sum;
return 0;
}