Pagini recente » Cod sursa (job #2398808) | Cod sursa (job #1128123) | Cod sursa (job #459616) | Cod sursa (job #2253698) | Cod sursa (job #1826123)
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
const int NMAX=1001,INF=2147483647;
std::vector<int> vecini[NMAX];
int flux[NMAX][NMAX],capacitate[NMAX][NMAX];
bool viz[NMAX];
int precedent[NMAX];
std::queue<int> coada;
bool bfs(int in,int sf)
{
memset(viz,0,sizeof viz);
memset(precedent,0,sizeof viz);
coada.push(in);
viz[in]=true;
while(!coada.empty())
{
int x=coada.front();
coada.pop();
for(std::vector<int>::iterator i=vecini[x].begin();i!=vecini[x].end();i++)
if(!viz[(*i)] && capacitate[x][(*i)]>flux[x][(*i)])
{
coada.push((*i));
precedent[(*i)]=x;
viz[(*i)]=true;
}
}
return viz[sf];
}
int Marime_Flux(int in,int sf)
{
int x=sf,rasp=INF;
while(x!=in)
{
rasp=std::min(rasp,capacitate[precedent[x]][x]-flux[precedent[x]][x]);
x=precedent[x];
}
return rasp;
}
void Mareste(int sf,int in,int l)
{
int x=sf;
while(x!=in)
{
flux[precedent[x]][x]+=l;
flux[x][precedent[x]]-=l;
x=precedent[x];
}
}
int Flux(int in,int sf)
{
int total=0;
while(bfs(in,sf))
{
int l=Marime_Flux(in,sf);
Mareste(sf,in,l);
total+=l;
}
return total;
}
int main()
{
FILE *in=fopen("maxflow.in","r");
int n,m;
fscanf(in,"%d %d ",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,c;
fscanf(in,"%d %d %d ",&x,&y,&c);
vecini[x].push_back(y);
vecini[y].push_back(x);
capacitate[x][y]=c;
}
fclose(in);
int rasp=Flux(1,n);
FILE *out=fopen("maxflow.out","w");
fprintf(out,"%d\n",rasp);
fclose(out);
return 0;
}