Pagini recente » Cod sursa (job #861233) | Cod sursa (job #2371652) | Cod sursa (job #1368790) | Cod sursa (job #3206341) | Cod sursa (job #2385995)
#include <fstream>
#include <cstring>
#include <algorithm>
constexpr int MAX_N = 1001, MAX_M = 20001, INF = 0x7fffffff;
int n, m;
int first[MAX_N], id[MAX_M], next[MAX_M], at[MAX_M], count;
int c[MAX_N][MAX_N], f[MAX_N][MAX_N];
inline void add(int from, int to, int index) {
++count;
at[count] = to;
id[count] = index;
next[count] = first[from];
first[from] = count;
}
int q[MAX_N], prev[MAX_N], st, dr;
inline bool bfs() {
std::memset(prev, 0, sizeof(prev));
st = dr = 0;
q[0] = 1;
int p, x, y;
while (st <= dr) {
x = q[st++];
if (x == n) return true;
for (p = first[x]; p != 0; p = next[p]) {
y = at[p];
if (prev[y] == 0 && f[x][y] < c[x][y]) {
prev[y] = x;
q[++dr] = y;
}
}
}
return false;
}
inline int flux() {
int y = n, x, fMin = INF;
while (y != 1) {
x = prev[y];
fMin = std::min(fMin, c[x][y] - f[x][y]);
y = x;
}
return fMin;
}
inline void update(int flux) {
int y = n, x;
while (y != 1) {
x = prev[y];
f[x][y] += flux;
f[y][x] -= flux;
y = x;
}
}
int r[MAX_M], rCount;
bool vis[MAX_N], a[MAX_N][MAX_N];
void rBfs() {
std::memset(prev, 0, sizeof(prev));
st = dr = 0;
q[0] = 1;
int p, x, y;
while (st <= dr) {
x = q[st++];
for (p = first[x]; p != 0; p = next[p]) {
y = at[p];
if (f[x][y] == c[x][y]) r[rCount++] = id[p];
else if (prev[y] == 0) {
prev[y] = x;
q[++dr] = y;
}
}
}
}
int main() {
std::ifstream in("critice.in");
std::ofstream out("critice.out");
int i, x, y, z;
in >> n >> m;
for (i = 1; i <= m; ++i) {
in >> x >> y >> z;
add(x, y, i);
add(y, x, i);
c[x][y] = c[y][x] = z;
}
int fc;
while (bfs()) {
fc = flux();
update(fc);
}
rBfs();
std::sort(r, r + rCount);
out << rCount;
for (i = 0; i < rCount; ++i) out << '\n' << r[i];
return 0;
}