Pagini recente » Cod sursa (job #1071615) | Cod sursa (job #2266081) | Cod sursa (job #2619173) | Cod sursa (job #1987086) | Cod sursa (job #318497)
Cod sursa(job #318497)
#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 V[2][maxN];
void bfs () {
int st, dr, i, now, next;
Q[st = 0] = SOURCE; dr = 1;
V[0][SOURCE] = 1; V[1][DEST] = 1;
while (st < dr) {
now = Q[st ++];
for (i = 0; i < (int) G[now].size (); ++ i) {
next = G[now][i];
if (C[now][next] == 0 || V[0][next])
continue;
V[0][next] = 1;
Q[dr ++] = next;
}
}
Q[st = 0] = DEST; dr = 1;
while (st < dr) {
now = Q[st ++];
for (i = 0; i < (int) G[now].size (); ++ i) {
next = G[now][i];
if (C[next][now] == 0 || V[1][next])
continue;
V[1][next] = 1;
Q[dr ++] = next;
}
}
}
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;
}
Sol = flux ();
bfs();
/*for (i = 1; i <= N; ++ i)
printf("%d ", V[0][i]);
puts ("");
for (i = 1; i <= N; ++ i)
printf("%d ", V[1][i]);
puts ("");
*/
for (i = 0; i < (int) Muchii.size (); ++ i) {
int a = Muchii[i].ff;
int b = Muchii[i].ss;
if ((V[0][a] && V[1][b]) || (V[0][b] && V[1][a]))
Solutie.pb(i + 1);
}
printf("%d\n", Solutie.size ());
for (i = 0; i < (int) Solutie.size (); ++ i)
printf("%d\n", Solutie[i]);
}