Pagini recente » Cod sursa (job #822868) | Cod sursa (job #2838868) | Cod sursa (job #848820) | Cod sursa (job #2512302) | Cod sursa (job #221799)
Cod sursa(job #221799)
#include <stdio.h>
#include <string.h>
#define nmax 1005
#define mmax 10005
#define inf 1<<30
#define pr(x) fprintf(stderr,#x" = %d\n",x)
struct muchie
{
int a, b;
};
int n, m, f [nmax] [nmax], prev [nmax], q [nmax*nmax], cr [mmax], a [nmax] [nmax];
muchie w [mmax];
int c [nmax] [nmax];
char v1 [nmax], v2 [nmax];
inline int abs (int x)
{
if (x > 0)
return x;
return -x;
}
void scan ()
{
int i, z;
scanf ("%d%d", &n, &m);
for (i=1; i<=m; ++i)
{
scanf ("%d%d%d", &w [i].a, &w [i].b, &z);
a [w [i].a] [w [i].b]=a [w [i].b] [w [i].a]=z;
c [w [i].a] [++c [w [i].a] [0]]=w [i].b;
c [w [i].b] [++c [w [i].b] [0]]=w [i].a;
}
}
int bf ()
{
int i, p, u, j;
char viz [nmax];
memset(viz,0,sizeof(viz));
p=u=1;
q [p]=1;
viz [1]=1;
while (p <= u)
{
for (i=1; i<=c [p [q]] [0]; ++i)
{
j=c [q [p]] [i];
if (a [q [p]] [j] > f [q [p]] [j] && !viz [j])
{
q [++u]=j;
viz [j]=1;
prev [j]=q [p];
if (j == n)
return 1;
}
}
++p;
}
return 0;
}
void flux ()
{
int min, p, x;
while (bf ())
{
min=inf;
p=n;
while (p > 1)
{
x=a [prev [p]] [p] - f [prev [p]] [p];
if (x < min)
min=x;
p=prev [p];
}
p=n;
while (p > 1)
{
f [prev [p]] [p]+=min;
f [p] [prev [p]]-=min;
p=prev [p];
}
}
}
void bf2 (int s, char v [])
{
int i, p, u, j;
p=u=1;
q [p]=s;
v [s]=1;
while (p <= u)
{
for (i=1; i<=c [q [p]] [0]; ++i)
{
j=c [q [p]] [i];
if (!v [j] && a [q [p]] [j] > abs (f [q [p]] [j]))
{
q [++u]=j;
v [j]=1;
}
}
++p;
}
}
void rez ()
{
int i;
flux ();
bf2 (1, v1);
bf2 (n, v2);
for (i=1; i<=m; ++i)
if ((v1 [w [i].a] && v2 [w [i].b] ) || (v1 [w [i].b] && v2 [w [i].a]))
cr [++cr [0]]=i;
}
void print ()
{
int i;
for (i=0; i<=cr [0]; ++i)
printf ("%d\n", cr [i]);
}
int main ()
{
freopen ("critice.in", "r", stdin);
freopen ("critice.out", "w", stdout);
scan ();
rez ();
print ();
return 0;
}