Nu exista pagina, dar poti sa o creezi ...
Cod sursa(job #190042)
Utilizator | Data | 19 mai 2008 20:04:23 | |
---|---|---|---|
Problema | Critice | Scor | 0 |
Compilator | c | Status | done |
Runda | Arhiva de probleme | Marime | 2.16 kb |
#include <stdio.h>
#include <string.h>
#define input "critice.in"
#define output "critice.out"
#define nmax 1001
#define mmax 10001
#define maxim 30000
int niv,n,m,i,v[nmax][nmax],c[nmax][nmax],f[nmax][nmax],nv[nmax],fol[nmax],d[nmax],t[nmax];
int v1[nmax],v2[nmax],xx[mmax],yy[mmax];
void add(int x,int y,int z)
{
nv[x]++; nv[y]++;
v[x][nv[x]]=y;
v[y][nv[y]]=x;
c[x][y]=c[y][x]=z;
}
int abs(int x)
{
if (x>0) return x;
return -x;
}
void read()
{
int i,x,y,c;
freopen(input,"r",stdin);
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y);
add(x,y,c);
xx[i]=x;
yy[i]=y;
}
}
int min(int a,int b)
{
if (a<b) return a;
return b;
}
int max(int a,int b)
{
if (a>b) return a;
return b;
}
int bfs()
{
int i,cap=1,coada=1,nod;
d[1]=1;
t[1]=0;
for (i=1;i<=n;i++) fol[i]=0; fol[1]=1;
while (cap<=coada)
{
nod=d[cap];
for (i=1;i<=nv[nod];i++)
if (fol[v[nod][i]]==0 && c[nod][v[nod][i]]-f[nod][v[nod][i]]>0)
{
coada++;
d[coada]=v[nod][i];
fol[v[nod][i]]=1;
t[v[nod][i]]=nod;
}
cap++;
}
return fol[n];
}
void solve()
{
int flux;
while (bfs())
{
flux=maxim;
for (i=n;i-1;i=t[i]) flux=min(flux,c[t[i]][i]-f[t[i]][i]);
for (i=n;i-1;i=t[i])
{
f[t[i]][i]+=flux;
f[i][t[i]]-=flux;
}
}
}
void bf(int n,int d[])
{
int i,cap=1,coada=1,nod;
d[1]=n;
for (i=1;i<=n;i++) fol[i]=0; fol[n]=1;
while (cap<=coada)
{
nod=d[cap];
for (i=1;i<=nv[nod];i++)
if (fol[v[nod][i]]==0 && c[nod][v[nod][i]]-abs(f[nod][v[nod][i]])>0)
{
coada++;
d[coada]=v[nod][i];
fol[v[nod][i]]=1;
}
cap++;
}
for (i=1;i<=n;i++) d[i]=fol[i];
}
void write()
{
int x,y,i,nr=0;
freopen(output,"w",stdout);
bf(1,v1);
bf(n,v2);
for (i=1;i<=m;i++)
{
x=xx[i]; y=yy[i];
if ((v1[x] && v2[y]) || (v2[x] && v1[y])) nr++;
}
printf("%d\n",nr);
for (i=1;i<=m;i++)
{
x=xx[i]; y=yy[i];
if ((v1[x] && v2[y]) || (v2[x] && v1[y])) printf("%d\n",i);
}
}
int main()
{
read();
solve();
write();
return 0;
}