Pagini recente » Cod sursa (job #1568628) | Cod sursa (job #202072) | Profil StarGold2 | Cod sursa (job #994543) | Cod sursa (job #320812)
Cod sursa(job #320812)
#include <fstream>
#include <iostream>
using namespace std;
struct nod {
unsigned int dest;
int cap;
nod *next, *inv;
};
nod *graf[1001];
unsigned int flux[1001][1001];
void add (unsigned int x, unsigned int y, unsigned int cap)
{
nod *nou = new nod;
nou->dest = y;
nou->cap = cap;
nou->next = graf[x];
graf[x] = nou;
nod *nou2 = new nod;
nou2->dest = x;
nou2->cap = 0;
nou2->next = graf[y];
graf[y] = nou2;
nou2->inv = nou;
nou->inv = nou2;
}
unsigned int nNoduri, nMuchii, parent[1001];
unsigned int BFS ()
{
unsigned int vis[1001], Q[1001], *Q_push, *Q_pop, fluxmin[1001], visited[1001];
//cautam un drum pe care avem flux (din 1 in nNoduri)
memset(parent, 0, sizeof(parent));
memset(vis, 0, sizeof(vis));
memset(visited, 0, sizeof(visited));
Q_push = Q_pop = Q;
*(Q_push++) = 1;
parent[1] = 0;
visited[1] = 1;
fluxmin[1] = 1<<30; // INF
fluxmin[nNoduri] = 0;
while (Q_pop < Q_push) {
unsigned int crt = *(Q_pop++);
//cerr << "Scoatem " << crt << endl;
if (crt == nNoduri) break;
for (nod *cnod = graf[crt]; cnod; cnod = cnod->next) {
if (visited[cnod->dest]) continue;
unsigned int cf = cnod->cap - flux[crt][cnod->dest];
if (cf) {
*(Q_push++) = cnod->dest; visited[cnod->dest] = 1; parent[cnod->dest] = crt;
fluxmin[cnod->dest] = fluxmin[crt];
if (cf < fluxmin[crt]) fluxmin[cnod->dest] = cf;
}
}
}
return fluxmin[nNoduri];
}
void maxflow ()
{
unsigned int min;
while ( (min=BFS()) ) {
unsigned int crt = nNoduri;
//cerr << nNoduri << ' ';
while (parent[crt]) {
//cerr << parent[crt] << ' ';
flux[parent[crt]][crt] += min;
flux[crt][parent[crt]] -= min;
crt = parent[crt];
}
//cerr << "("<<min<<")" << '\n';
}
}
int main ()
{
ifstream in("maxflow.in");
ofstream out("maxflow.out");
in >> nNoduri >> nMuchii;
for (unsigned int i=0; i<nMuchii; ++i) {
unsigned int x,y,cap;
in >> x >> y >> cap;
add(x,y,cap);
}
in.close();
maxflow();
unsigned int rez=0;
for (unsigned int i=2; i<=nNoduri; ++i)
rez += flux[1][i];
out << rez << '\n';
out.close();
return 0;
}