Pagini recente » Cod sursa (job #1890537) | Cod sursa (job #1941179) | Cod sursa (job #236552) | Cod sursa (job #92899) | Cod sursa (job #81638)
Cod sursa(job #81638)
#include <stdio.h>
#include <memory.h>
#define NMAX 1002
#define MMAX 10002
#define INFI 0x3f3f3f3f
int cap[NMAX][NMAX];
int n, m;
int a[MMAX], b[MMAX];
int source, sink;
#define DIM 4000000
char buf[DIM];
int poz;
#define cin(x) \
{ \
x = 0; \
while(buf[poz] < '0' || buf[poz] > '9') \
if(++poz == DIM) \
fread(buf, 1, DIM, stdin), poz = 0; \
while(buf[poz] >= '0' && buf[poz] <= '9') \
{ \
x = x*10 + (buf[poz]-'0'); \
if(++poz == DIM) \
fread(buf, 1, DIM, stdin), poz = 0; \
} \
} \
void read()
{
fread(buf, 1, DIM, stdin);
int i;
int c;
cin(n);
cin(m);
for(i = 1; i <= m; ++i)
{
cin(a[i]);
cin(b[i]);
cin(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 main()
{
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
read();
while(bf(0));
printf(" \n");
int nr = 0;
for(int i = 1, ok; i <= m; ++i)
{
ok = 1;
if(!cap[ a[i] ][ b[i] ])
{
++cap[ a[i] ][ b[i] ];
if(bf(1))
printf("%d\n", i), ++nr, ok = 0;
--cap[ a[i] ][ b[i] ];
}
if(!cap[ b[i] ][ a[i] ] && ok)
{
++cap[ b[i] ][ a[i] ];
if(bf(1))
printf("%d\n", i), ++nr;
--cap[ b[i] ][ a[i] ];
}
}
fseek(stdout, 0, SEEK_SET);
printf("%d", nr);
return 0;
}