Pagini recente » Cod sursa (job #2250702) | Cod sursa (job #1697065) | Cod sursa (job #2282630) | Cod sursa (job #2984730) | Cod sursa (job #591525)
Cod sursa(job #591525)
#include<fstream>
#include<queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N=1010;
int flux[N][N],n,m,pred[N],cap[N][N];
vector<int>a[N];
bool viz[N];
queue<int>coada;
void f()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
out<<flux[i][j]<<"\t ";
out<<"\n";
}
out<<"\n";
}
void read()
{
int x,y,z;
in>>n>>m;
for(int i=1;i<=m;i++)
{
in>>x>>y>>z;
cap[x][y]=z;
a[x].push_back(y);
a[y].push_back(x);
}
}
void reset()
{
for(int i=0;i<=n;i++)
viz[i]=0,pred[i]=0;
}
bool bfs()
{
int x=1,y,p=1,u=0,v[N];
v[++u]=1;
viz[1]=1;
while(p<=u)
{
x=v[p++];
for(int i=0;i<a[x].size();i++)
{
y=a[x][i];
if(flux[x][y]<cap[x][y] && !viz[y])
{
viz[y]=1;
v[++u]=y;
pred[y]=x;
if(y==n)
return true;
}
}
}
return false;
}
inline int min(int w,int e)
{
return w<e?w:e;
}
void solve()
{
int i=n,minim,sol=0,d=0x3f3f3f3f;
while(bfs())
{
i=n,minim=d;
while(pred[i])
{
//out<<i<<"<-"<<pred[i]<<"<-";
minim=min(minim, (cap[pred[i]][i]-flux[pred[i]][i]) );
i=pred[i];
}
//out<<"\n";
sol+=minim;
i=n;
while(pred[i])
{
flux[pred[i]][i]+=minim;
flux[i][pred[i]]-=minim;
i = pred[i];
}
reset();
}
out<<sol;
}
int main()
{
read();
solve();
return 0;
}