Pagini recente » Cod sursa (job #1832732) | Cod sursa (job #2455504) | Cod sursa (job #1065703) | Cod sursa (job #2295656) | Cod sursa (job #867175)
Cod sursa(job #867175)
#include<stdio.h> // date de intrare: nodul de final ( nodul de inceput este 1 )
#include<vector> // noduri, muchii & config grafului
#include<queue>
#include<math.h>
using namespace std;
FILE*in=fopen("maxflow.in","r");
FILE*out=fopen("maxflow.out","w");
int muchii,noduri,tata[1008],final,capacitate[1008][1008],flux[1008][1008];
int minim=(1<<30)-1,flux_final=0;
int backup(int nod);
queue <int> coada;
bool parcurge();
vector<int> a[1008];
int main()
{
//fscanf(in,"%d",&final);
fscanf(in,"%d%d",&noduri,&muchii);
final=noduri;
for(int i=0;i<muchii;++i)
{
int nody,nodz,cost;
fscanf(in,"%d%d%d",&nody,&nodz,&cost);
a[nody].push_back(nodz);
a[nodz].push_back(nody);
capacitate[nody][nodz]=cost;
capacitate[nodz][nody]=-cost;
}
while(parcurge())
{
backup(final);
flux_final+=minim;
minim=9999;
}
fprintf(out,"%d",flux_final);
}
bool parcurge()
{
//bool vizitat[1000];
while(!coada.empty())
coada.pop();
for(int i=1;i<=noduri;++i)
tata[i]=0;
coada.push(1);
while(!coada.empty())
{
int curent=coada.front();
coada.pop();
for(int i=0;i<(int)a[curent].size();++i)
{
if(!tata[a[curent][i]])
if(capacitate[curent][a[curent][i]]!=flux[curent][a[curent][i]]) // mai ai loc pe acolo
{
tata[a[curent][i]]=curent;
coada.push(a[curent][i]);
}
}
if(tata[final])
break;
}
if(tata[final])
return true;
else
return false;
}
int backup(int nod)
{
if(nod!=1)
{
if(capacitate[tata[nod]][nod]>0)
minim=min(minim,capacitate[tata[nod]][nod]);
backup(tata[nod]);
flux[tata[nod]][nod]+=minim;
}
else
return minim;
}