Pagini recente » Cod sursa (job #2171960) | Cod sursa (job #2366330) | Cod sursa (job #1407106) | Cod sursa (job #2905237) | Cod sursa (job #526473)
Cod sursa(job #526473)
#include <fstream>
#include <vector>
#include <queue>
#define nmax 5
#define inf 999999
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int source,sink,flow,n,m,c[nmax][nmax],f[nmax][nmax]; //f[x][y]=flux (x,y), c[x][y]=capacitate (x,y)
int parent[nmax];
vector <int> g[nmax];
bool viz[nmax];
void read ()
{
int x,y,z,i;
fin>>n>>m;
source=1; sink=n; //initializez sursa si destinatia
for (i=1; i<=m; i++)
{
fin>>x>>y>>z;
g[x].push_back (y);
g[y].push_back (x);
c[x][y]+=z; //+= daca sunt mai multe arce
}
fin.close ();
}
bool bfs ()
{
int node,child;
queue <int> q;
memset (viz,false,sizeof(viz));
q.push(source);
viz[source]=true;
while (!q.empty ())
{
node=q.front ();
q.pop ();
if (node==sink)
continue;
for (size_t j=0; j<g[node].size (); j++)
{
child=g[node][j];
if (c[node][child]==f[node][child] || viz[child])
continue;
viz[child]=true;
q.push (child);
parent[child]=node;
}
}
return viz[sink];
}
void Edmonds_Karp ()
{
int node,fmin;
while (bfs())
{
for (size_t i=0; i<g[sink].size(); i++)
{
node=g[sink][i];
if (f[node][sink]==c[node][sink] || (!viz[node]))
continue;
parent[sink]=node;
fmin=inf;
for (node=sink; node!=source; node=parent[node])
fmin=min(fmin,c[parent[node]][node]-f[parent[node]][node]);
if (fmin==0) continue;
for (node=sink; node!=source; node=parent[node])
{
f[parent[node]][node]+=fmin;
f[node][parent[node]]-=fmin;
}
flow+=fmin;
}
}
}
void write ()
{
fout<<flow;
fout.close ();
}
int main ()
{
read ();
Edmonds_Karp ();
write ();
return 0;
}