Pagini recente » Cod sursa (job #389728) | Cod sursa (job #595816) | Cod sursa (job #652914) | Cod sursa (job #2376232) | Cod sursa (job #81630)
Cod sursa(job #81630)
#include <stdio.h>
#include <memory.h>
#define NMAX 1002
#define MMAX 10002
#define INFI 0x3f3f3f3f
int cap[NMAX][NMAX];
int n, m;
int flux;
int a[MMAX], b[MMAX];
int source, sink;
void read()
{
int i;
int c;
scanf("%d%d", &n, &m);
for(i = 1; i <= m; ++i)
{
scanf("%d%d%d", &a[i], &b[i], &c);
cap[a[i]][b[i]] = c;
cap[b[i]][a[i]] = c;
}
source = 1, sink = n;
}
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
int bf(short type)
{
int i, x;
int q[NMAX], t[NMAX];
short uz[NMAX], ok = 1;
int inc, sf;
memset(uz, 0, sizeof(uz));
inc = sf = 1;
q[1] = source;
++uz[source];
while(inc <= sf && ok)
{
x = q[inc++];
for(i = source; i <= sink; ++i)
{
if(cap[x][i] && !uz[i])
{
++uz[i];
q[++sf] = i;
t[i] = x;
ok -= (i == sink);
}
}
}
if(!uz[sink])
return 0;
if(type)
return 1;
int min = INFI;
for(i = sink; i != source; i = t[i])
min = MIN(min, cap[ t[i] ][i]);
for(i = sink; i != source; i = t[i])
cap[ t[i] ][i] -= min, cap[i][ t[i] ] += min;
return min;
}
int fk()
{
int f = 0, aux;
while(1)
{
aux = bf(0);
if(!aux)
return f;
f += aux;
}
return f;
}
int main()
{
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
read();
flux = fk();
//printf("%d\n", flux);
printf(" \n");
int nr = 0;
for(int i = 1; i <= m; ++i)
{
if(!cap[ a[i] ][ b[i] ] || !cap[ b[i] ][ a[i] ])
{
++cap[ a[i] ][ b[i] ];
++cap[ b[i] ][ a[i] ];
if(bf(1))
printf("%d\n", i), ++nr;
--cap[ a[i] ][ b[i] ];
--cap[ b[i] ][ a[i] ];
}
}
fseek(stdout, 0, SEEK_SET);
printf("%d", nr);
return 0;
}