Pagini recente » Cod sursa (job #1709632) | Cod sursa (job #1479058) | Cod sursa (job #951189) | Cod sursa (job #1139618) | Cod sursa (job #606412)
Cod sursa(job #606412)
#include<fstream>
#include<cmath>
#include<cstdlib>
#include<queue>
using namespace std;
int n,m,s,d; // s=nodul sursa | d=nodul destinatie
int C[1010][1010]; // capacitatea fiecarui arc
int F[1010][1010]; // fluxul fiecarui arc
int vizitat[1010]; // in acest vector vom marca nodurile
int *G[1010];
void Citire()
{
int i,x,y,c;
ifstream fin("maxflow.in");
fin>>n>>m;
for(i=1;i<=n;i++)
{
G[i]=(int *)realloc(G[i],sizeof(int));
G[i][0]=0;
}
s=1;
d=n;
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
C[x][y]=c;
G[x][0]++;
G[x]=(int *)realloc(G[x],(G[x][0]+1)*sizeof(int));
G[x][G[x][0]]=y;
G[y][0]++;
G[y]=(int *)realloc(G[y],(G[y][0]+1)*sizeof(int));
G[y][G[y][0]]=x;
}
fin.close();
}
int BFS()
{
//returneaza 1 daca nodul destinatie nu a fost marcat
int i,x;
queue <int> Q;
Q.push(s);
vizitat[s]=1;
while(!Q.empty() && vizitat[d]==0)
{
x=Q.front();
Q.pop();
for(i=1;i<=G[x][0];i++)
{
if(vizitat[G[x][i]]==0)
{
if(F[x][G[x][i]]<C[x][G[x][i]])
{
vizitat[G[x][i]]=x;
Q.push(G[x][i]);
}
else
if(F[G[x][i]][x]>0)
{
vizitat[G[x][i]]=-x;
Q.push(G[x][i]);
}
}
}
}
if(vizitat[d]==0)
return 1;
return 0;
}
void Edmonds_Karp()
{
int i,a,b,lg,v;
int L[1000]; // L = lant de ameliorare a fluxului
do
{
//marcam nodurile printr-o parcurgere BFS
memset(vizitat,0,sizeof(vizitat));
if(BFS()==1) //daca nodul destinatie nu a fost marcat am gasit fluxul maxim
return;
L[0]=d;
lg=0;
a=b=2000000000;
while(L[lg]!=s)
{
lg++;
L[lg]=abs(vizitat[L[lg-1]]);
if(vizitat[L[lg-1]]>0)
a=min(a,C[L[lg]][L[lg-1]]-F[L[lg]][L[lg-1]]);
else
if(vizitat[L[lg-1]]<0)
b=min(b,F[L[lg-1]][L[lg]]);
}
v=min(a,b);
//marim fluxul de-a lungul lantului de ameliorare cu v
for(i=lg;i>0;i--)
{
if(vizitat[L[i-1]]>0)
F[L[i]][L[i-1]]+=v;
else
F[L[i-1]][L[i]]-=v;
}
}
while(1);
}
void Afisare()
{
ofstream fout("maxflow.out");
int i,sol=0;
for(i=1;i<=n;i++)
{
sol+=F[i][d]; //fluxul maxim este suma fluxurilor care intra in d
/* sol+=F[s][i]; */ //sau suma fluxurilor care ies din s
}
fout<<sol<<"\n";
fout.close();
}
int main()
{
Citire();
Edmonds_Karp();
Afisare();
return 0;
}