No me había fijado que había puesto C, sin STL lo que he dicho como que no xDD.
Por si te sirve de ayuda, te dejo un código del algoritmo de Dinic que tenía hecho, sigue el formato de entrada y salida de este problema:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=10&page=show_problem&problem=761
Por si te sirve de ayuda, te dejo un código del algoritmo de Dinic que tenía hecho, sigue el formato de entrada y salida de este problema:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=10&page=show_problem&problem=761
Código (cpp) [Seleccionar]
/****************************************************************************************/
/* Algoritmo Dinic (usa blocking flows en lugar de caminos aumentativos) Coste: O(V^2E) */
/****************************************************************************************/
#include <iostream>
#include <string.h>
using namespace std;
//Cambiar constantes si es necesario
#define NODOS 100
const int INF = 1000000000;
int adj[NODOS][NODOS], deg[NODOS], cap[NODOS][NODOS], padre[NODOS], f[NODOS][NODOS], MC[NODOS], visto[NODOS];
int n, m; // n = |V|, m = |E|
int Q[NODOS]; //cola
int ebp, esp;
bool bfs(int s, int t) {
esp = ebp = 0;
memset(padre, -1, sizeof(padre));
memset(visto, 0, sizeof(visto));
visto[s] = 1;
padre[s] = -2;
Q[esp++] = s;
while (ebp != esp) {
int u = Q[ebp++];
for (int i = 0; i < deg[u]; ++i) {
int v = adj[u][i];
if (cap[u][v] - f[u][v] > 0 and not visto[v]) {
visto[v] = 1;
padre[v] = u;
Q[esp++] = v;
}
}
}
return visto[t];
}
void mincut(int s) {
ebp = esp = 0;
Q[esp++] = s;
MC[s] = 1;
while (ebp != esp) {
int u = Q[ebp++];
for (int i = 0; i < deg[u]; ++i) {
int v = adj[u][i];
if (cap[u][v] - f[u][v] > 0 and not MC[v]) {
MC[v] = 1;
Q[esp++] = v;
}
}
}
}
int maxflow(int s, int t) {
int flow = 0;
memset(MC, 0, sizeof(MC));
memset(f, 0, sizeof(f));
while (bfs(s, t)) {
for (int i = 0; i < n; ++i) {
if (cap[i][t] - f[i][t] > 0 and padre[i] != -1) {
int bot = cap[i][t] - f[i][t];
for (int v = i, u = padre[i]; u >= 0; v = u, u = padre[u])
bot = min(bot, cap[u][v] - f[u][v]);
if (bot == 0) continue;
f[i][t] += bot;
f[t][i] -= bot;
for (int v = i, u = padre[i]; u >= 0; v = u, u = padre[u]) {
f[u][v] += bot;
f[v][u] -= bot;
}
flow += bot;
}
}
}
mincut(s); //MC[u] == 1 <=> u esta en la particion de s
return flow;
}
int main() {
int net = 1;
while (cin >> n and n > 0) {
memset(deg, 0, sizeof(deg));
memset(cap, 0, sizeof(cap));
int s, t;
cin >> s >> t >> m;
s--; t--;
for (int i = 0; i < m; ++i) {
int a, b, c;
cin >> a >> b >> c;
--a; --b;
if (cap[a][b] == 0) {
adj[a][deg[a]++] = b;
adj[b][deg[b]++] = a;
}
cap[a][b] += c;
cap[b][a] += c;
}
cout << "Network " << net++ << endl;
cout << "The bandwidth is " << maxflow(s,t) << "." << endl << endl;
}
}