Pagini recente » Cod sursa (job #2513883) | Cod sursa (job #1746460) | Cod sursa (job #270057) | Cod sursa (job #737397) | Cod sursa (job #465029)
Cod sursa(job #465029)
#include <stdio.h>
#include <vector>
using namespace std;
struct nod
{
int nr;
nod *adr;
} *graf[1005],*u;
int n,m,i,x[10005],y[10005],z,c[1005][1005],s[1005],q[1005],st,dr,f[1005][1005],tt[1005],minim,sol;
bool k;
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=m;++i)
{
scanf("%d %d %d",&x[i],&y[i],&z);
u=new nod;
u->nr=y[i];
u->adr=graf[x[i]];
graf[x[i]]=u;
u=new nod;
u->nr=x[i];
u->adr=graf[y[i]];
graf[y[i]]=u;
c[x[i]][y[i]]=z;
c[y[i]][x[i]]=z;
}
k=true;
while (k)
{
k=false;
memset(s,0,sizeof(s));
s[1]=1;
q[1]=1;
for (st=dr=1;st<=dr;++st)
if (q[st]==n)
k=true;
else
for (u=graf[q[st]];u;u=u->adr)
if (!s[u->nr] && c[q[st]][u->nr]>f[q[st]][u->nr])
{
s[u->nr]=1;
q[++dr]=u->nr;
tt[u->nr]=q[st];
}
if (k)
for (u=graf[n];u;u=u->adr)
if (s[u->nr] && c[u->nr][n]>f[u->nr][n])
{
minim=c[u->nr][n]-f[u->nr][n];
for (i=u->nr;i!=1;i=tt[i])
if (c[tt[i]][i]-f[tt[i]][i]<minim)
minim=c[tt[i]][i]-f[tt[i]][i];
if (minim>0)
{
tt[n]=u->nr;
for (i=n;i!=1;i=tt[i])
{
f[tt[i]][i]+=minim;
f[i][tt[i]]-=minim;
}
}
}
}
memset(s,0,sizeof(s));
q[1]=1;
s[1]=1;
for (st=dr=1;st<=dr;++st)
for (u=graf[q[st]];u;u=u->adr)
if (!s[u->nr] && c[q[st]][u->nr]>f[q[st]][u->nr])
{
q[++dr]=u->nr;
s[u->nr]=1;
}
q[1]=n;
s[n]+=2;
for (st=dr=1;st<=dr;++st)
for (u=graf[q[st]];u;u=u->adr)
if (s[u->nr]<2 && c[q[st]][u->nr]>f[q[st]][u->nr])
{
q[++dr]=u->nr;
s[u->nr]+=2;
}
for (i=1;i<=m;++i)
if (((s[x[i]]==1 || s[x[i]]==3) && s[y[i]]>1) || ((s[y[i]]==1 || s[y[i]]==3) && s[x[i]]>1))
++sol;
printf("%d\n",sol);
for (i=1;i<=m;++i)
if (((s[x[i]]==1 || s[x[i]]==3) && s[y[i]]>1) || ((s[y[i]]==1 || s[y[i]]==3) && s[x[i]]>1))
printf("%d\n",i);
return 0;
}