Pagini recente » Cod sursa (job #1984083) | Cod sursa (job #924045) | Cod sursa (job #892336) | Cod sursa (job #2862647) | Cod sursa (job #318468)
Cod sursa(job #318468)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define maxN 1001
#define SOURCE 1
#define DEST N
#define pb push_back
#define oo 100000000
#define pii pair <int, int>
#define ff first
#define ss second
#define mp make_pair
int Q[maxN * 3], P[maxN], T[maxN], C[maxN][maxN], CC[maxN][maxN];
int N, M;
vector < int > G[maxN];
vector < pii > Muchii;
vector < int > Solutie;
bool drum () {
int st, dr, i, now, next;
memset (P, 0, sizeof(P));
memset (T, 0, sizeof(T));
Q[st = 0] = SOURCE; dr = 1;
T[SOURCE] = oo; P[SOURCE] = -1;
while (st < dr) {
now = Q[st ++ ];
for (i = 0; i < (int) G[now].size (); ++ i) {
next = G[now][i];
if (! P[next] && C[now][next] > 0) {
P[next] = now;
T[next] = min (abs (C[now][next]), T[now]);
Q[dr ++] = next;
if (next == DEST)
return true;
}
}
}
return false;
}
int flux () {
int FluxTotal = 0, nod, i, j;
while (drum () ) {
for (nod = DEST; nod != SOURCE; nod = P[nod]) {
C[P[nod]][nod] -= T[DEST];
C[nod][P[nod]] += T[DEST];
}
FluxTotal += T[DEST];
}
return FluxTotal;
}
int main () {
int k, i, j, a, b, c, Sol = 0, now;
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, &c);
G[a].pb(b);
G[b].pb(a);
Muchii.pb (mp (a, b));
C[a][b] += c;
C[b][a] += c;
CC[a][b] += c;
CC[b][a] += c;
}
Sol = flux ();
for (k = 0; k < (int) Muchii.size (); ++ k) {
for (i = 1; i <= N; ++ i)
for (j = 1; j <= N; ++ j)
C[i][j] = CC[i][j];
++ C[Muchii[k].ff][Muchii[k].ss];
++ C[Muchii[k].ss][Muchii[k].ff];
if ((now = flux ()) > Sol)
Solutie.pb(k + 1);
}
printf("%d\n", Solutie.size ());
for (i = 0; i < (int) Solutie.size (); ++ i)
printf("%d\n", Solutie[i]);
}