Pagini recente » Cod sursa (job #1169258) | Cod sursa (job #44777) | Cod sursa (job #2040175) | Cod sursa (job #2953107) | Cod sursa (job #318509)
Cod sursa(job #318509)
#include <cstdio>
#include <cstring>
#define maxn 1001
#define inf 2000000000
using namespace std;
struct muchie {
int x, y, z;
};
int n, m, i, j, k, p, u, a, b, cc;
int c[maxn][maxn];
int flux[maxn], up[maxn], q[maxn], futot;
int ok;
int m1[maxn], m2[maxn];
muchie mu[10100];
void init() {
memset(flux, 0, sizeof(flux));
flux[1] = inf;
memset(up, -1, sizeof(up));
}
inline int min(int a, int b) {
if (a < b)
return a;
return b;
}
bool bfs() {
int nod, fiu, p, u, i;
p = u = 1;
q[1] = 1;
while (p <= u) {
nod = q[p];
for (i = 1; i <= n; i++)
if (c[nod][i] > 0) {
fiu = i;
if (flux[fiu] == 0) {
flux[fiu] = min(c[nod][fiu], flux[nod]);
up[fiu] = nod;
u++;
q[u] = fiu;
}
}
p++;
}
if (!flux[n])
return false;
futot += flux[n];
nod = n;
while (nod != 1) {
fiu = up[nod];
c[fiu][nod] -= flux[n];
c[nod][fiu] += flux[n];
nod = up[nod];
}
return true;
}
void bf1(int start) {
int nod, fiu, p, u;
p = u = 1;
q[1] = start;
m1[1] = 1;
while (p <= u) {
nod = q[p];
for (i = 1; i <= n; i++)
if (c[p][i] > 0) {
m1[i] = 1;
u++;
q[u] = i;
}
p++;
}
}
void bf2(int start) {
int nod, fiu, p, u;
p = u = 1;
q[1] = start;
m2[n] = 1;
while (p <= u) {
nod = q[p];
for (i = 1; i <= n; i++)
if (c[i][p] > 0) {
m2[i] = 1;
u++;
q[u] = i;
}
p++;
}
}
int main() {
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &a, &b, &cc);
mu[i].x = a; mu[i].y = b; mu[i].z = cc;
c[a][b] = cc;
c[b][a] = cc;
}
ok = 1;
while (ok) {
init();
ok = bfs();
}
bf1(1);
bf2(n);
int nr = 0;
for (i = 1; i <= m; i++) {
if (m1[mu[i].x] && m2[mu[i].y] && c[mu[i].x][mu[i].y] == 0 && c[mu[i].y][mu[i].x] != 0)
nr++;
int aux = mu[i].x; mu[i].x = mu[i].y; mu[i].y = aux;
if (m1[mu[i].x] && m2[mu[i].y] && c[mu[i].x][mu[i].y] == 0 && c[mu[i].y][mu[i].x] != 0)
nr++;
}
printf("%d\n", nr);
for (i = 1; i <= m; i++) {
if (m1[mu[i].x] && m2[mu[i].y] && c[mu[i].x][mu[i].y] == 0 && c[mu[i].y][mu[i].x] != 0)
printf("%d\n", i);
int aux = mu[i].x; mu[i].x = mu[i].y; mu[i].y = aux;
if (m1[mu[i].x] && m2[mu[i].y] && c[mu[i].x][mu[i].y] == 0 && c[mu[i].y][mu[i].x] != 0)
printf("%d\n", i);
}
return 0;
}