Pagini recente » Istoria paginii runda/boolanel_returns | Cod sursa (job #2548843) | Diferente pentru teorema-chineza-a-resturilor intre reviziile 11 si 89 | Monitorul de evaluare | Cod sursa (job #221644)
Cod sursa(job #221644)
#include <stdio.h>
#include <string.h>
#define nmax 1055
#define mmax 10005
#define inf 30000
#define pr(x) fprintf(stderr,#x" = %d\n",x)
struct muchie
{
int a, b;
};
int n, m, c [nmax] [nmax], f [nmax] [nmax], prev [nmax], q [nmax*nmax], cr [mmax];
muchie w [mmax];
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);
c [w [i].a] [w [i].b]=c [w [i].b] [w [i].a]=z;
}
}
int bf ()
{
int i, p, u;
char viz [nmax];
memset(viz,0,sizeof(viz));
p=u=1;
q [p]=1;
viz [1]=1;
while (p <= u)
{
for (i=1; i<=n; ++i)
if (c [q [p]] [i] > f [q [p]] [i] && !viz [i])
{
q [++u]=i;
viz [i]=1;
prev [i]=q [p];
if (i == n)
return 1;
}
++p;
}
return 0;
}
void flux ()
{
int min, p, x;
while (bf ())
{
min=inf;
p=n;
while (p != 1)
{
x=c [prev [p]] [p] - abs (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;
p=u=1;
q [p]=s;
v [s]=1;
while (p <= u)
{
for (i=1; i<=n; ++i)
if (!v [i] && c [q [p]] [i] > abs (f [q [p]] [i]))
{
q [++u]=i;
v [i]=1;
}
++p;
}
}
void rez ()
{
char v1 [nmax], v2 [nmax];
int i;
flux ();
memset (v1, 0, sizeof (v1));
memset (v2, 0, sizeof (v2));
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;
}