Pagini recente » Cod sursa (job #2028255) | Cod sursa (job #2086255) | Cod sursa (job #1874167) | Cod sursa (job #1534899) | Cod sursa (job #2959951)
/*
Ideea de rezolvare a algoritmului este urmatoarea:
Folosim algoritmul de Max Flow. Gata.
Complexitate:
Timp: O()
Memorie: O()
*/
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,s,t;
int viz[1005];
int parinte[1005];
int graf[1005][1005];
long long flux_maxim;
void AddMuchie(int x, int y, int c)
{
graf[x][y]=c;
}
bool bfs()
{
memset(viz,0,sizeof(viz));
memset(parinte,0,sizeof(parinte));
queue <int> q;
viz[1]=1;
q.push(1);
while(!q.empty())
{
int act=q.front();
q.pop();
if(act==t)
return true;
for(int i=1;i<=n;i++)
if(viz[i]==0 && graf[act][i]>0)
{
viz[i]=1;
parinte[i]=act;
q.push(i);
}
}
return false;
}
int maxFlow()
{
while(bfs())
{
for(int i=1;i<n;i++)
{ if(viz[i]!=0 && graf[i][t]>0)
{
int aux_flux=1<<30;
parinte[t]=i;
int j=t;
while(parinte[j]!=0)
{
aux_flux=min(aux_flux,graf[parinte[j]][j]);
j=parinte[j];
}
if(aux_flux!=0)
{
int j=t;
while(parinte[j]!=0)
{
graf[parinte[j]][j]-=aux_flux;
graf[j][parinte[j]]+=aux_flux;
j=parinte[j];
}
flux_maxim=flux_maxim+aux_flux;
}
}
}
}
return flux_maxim;
}
int main()
{
f>>n>>m;
s=1;
t=n;
int x,y,c;
for(int i=1;i<=m;i++)
{
f>>x>>y>>c;
AddMuchie(x,y,c);
}
g<<maxFlow();
return 0;
}