Pagini recente » Cod sursa (job #1042151) | Cod sursa (job #2099470) | Cod sursa (job #1600965) | Cod sursa (job #1633524) | Cod sursa (job #84939)
Cod sursa(job #84939)
#include <stdio.h>
#include <stdlib.h>
#define Nmax 1001
#define Mmax 10001
const char filein[] = "critice.in",
fileout[] = "critice.out";
int N, M, c[Nmax][Nmax], f[Nmax][Nmax], T[Nmax], gr[Nmax], x[Mmax], y[Mmax], *G[Nmax], Q[Nmax], mark[Nmax];
void readdata()
{
int i, a, b, cap;
scanf("%d %d", &N, &M);
for (i = 1; i <= M; ++i)
{
scanf("%d %d %d", &a, &b, &cap);
x[i] = a;
y[i] = b;
c[a][b] = cap;
c[b][a] = cap;
gr[a]++;
gr[b]++;
}
for (i = 1; i <= N; ++i)
{
G[i] = (int *) malloc((gr[i]+1) * sizeof(int));
G[i][gr[i]] = -1;
gr[i] = 0;
}
for (i = 1; i <= M; ++i)
{
G[x[i]][gr[x[i]]++] = y[i];
G[y[i]][gr[y[i]]++] = x[i];
}
}
int min(int a, int b)
{
if (a < b) return a;
else return b;
}
int bfs()
{
int *p, cap, coada, nr, i;
cap = coada = 1;
Q[cap] = 1;
for (i = 2; i <= N; ++i) T[i] = -1;
while (cap <= coada)
{
nr = Q[cap];
p = G[nr];
while (*p != -1)
{
if (T[*p] == -1 && (c[nr][*p] - f[nr][*p]) > 0)
{
T[*p] = nr;
coada++;
Q[coada] = *p;
if (*p == N) return 1;
}
++p;
}
++cap;
}
return 0;
}
void bf1(int start, int val)
{
int cap, coada, nr, *p;
cap = coada = 1;
Q[cap] = start;
mark[start] = val;
while (cap <= coada)
{
nr = Q[cap];
p = G[nr];
while (*p != -1)
{
if (mark[*p] != val && (c[nr][*p] - f[nr][*p]) > 0)
{
mark[*p] = val;
coada++;
Q[coada] = *p;
}
++p;
}
++cap;
}
}
void bf2(int start, int val)
{
int cap, coada, nr, *p;
cap = coada = 1;
Q[cap] = start;
mark[start] = val;
while (cap <= coada)
{
nr = Q[cap];
p = G[nr];
while (*p != -1)
{
if (mark[*p] != val && (c[*p][nr] - f[*p][nr]) > 0)
{
mark[*p] = val;
coada++;
Q[coada] = *p;
}
++p;
}
++cap;
}
}
void solve()
{
int i, j, r, rez = 0;
while (bfs())
{
for (i = 1; i <= N; ++i)
{
if (T[i] == -1 || c[i][N] <= f[i][N])
continue;
r = c[i][N] - f[i][N];
for (j = i; j != 1; j = T[j])
r = min(r, c[T[j]][j] - f[T[j]][j]);
if (r == 0) continue;
f[i][N] += r; f[N][i] -=r;
for (j = i; j != 1; j = T[j])
{
f[T[j]][j] += r;
f[j][T[j]] -= r;
}
}
}
bf1(1, 1);
bf2(N, 2);
for (i = 1; i <= M; ++i)
if (mark[x[i]] + mark[y[i]] == 3) rez++;
printf("%d\n", rez);
for (i = 1; i <= M; ++i)
if (mark[x[i]] + mark[y[i]] == 3)
printf("%d\n", i);
}
int main()
{
freopen(filein, "r", stdin);
freopen(fileout, "w", stdout);
readdata();
solve();
}