Pagini recente » Cod sursa (job #2504785) | Cod sursa (job #624593) | Cod sursa (job #324477) | Cod sursa (job #2579088) | Cod sursa (job #678661)
Cod sursa(job #678661)
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
#include <cstring>
using namespace std;
int poz[1009][1009],list[1009],n,tt[1009],viz[1009],C[1009][1009],F[1009][1009];
vector <int> v[1009];
int bf()
{
int nr=1,i=1,nod;
list[1]=1;viz[1]=1;
memset(viz,0,sizeof(viz));
for (;i<=nr;++i)
{
nod=list[i];
for (vector <int>::iterator it=v[nod].begin();it!=v[nod].end();++it)
if ((!viz[*it]) && (C[nod][*it]!=F[nod][*it]))
{tt[*it]=nod,viz[*it]=1;
if (*it!=n) list[++nr]=*it;
}
}
return viz[n];
}
int main()
{
int m,i,j,x,y,z;
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,&y,&z);
C[x][y]=z;C[y][x]=z;
poz[x][y]=poz[y][x]=i;
v[x].pb(y),v[y].pb(x);
}
while (bf())
for (vector <int>::iterator it=v[n].begin();it!=v[n].end();++it)
if ((viz[*it]) && (C[*it][n]!=F[*it][n]))
{
tt[n]=*it;
int nod=n,mn=100099;
for (;nod!=1;nod=tt[nod])
if (C[tt[nod]][nod]-F[tt[nod]][nod]<mn)
mn=C[tt[nod]][nod]-F[tt[nod]][nod];
for (nod=n;nod!=1;nod=tt[nod])
F[tt[nod]][nod]+=mn,F[nod][tt[nod]]-=mn;
}
/*for (i=1;i<=n;++i)
for (int j=i+1;j<=n;++j)
if ((C[i][j]==F[i][j]) && (poz[i][j]))
printf("%d ",poz[i][j]);*/
memset(viz,0,sizeof(viz));
m=list[1]=1;viz[1]=1;
for (i=1;i<=m;++i)
{
j=list[i];
for (vector <int>::iterator it=v[j].begin();it!=v[j].end();++it)
if ((C[j][*it]!=F[j][*it]) && (!viz[*it]))
{viz[*it]=1;if (*it!=n) list[++m]=*it;
}
}
m=1;list[1]=n;
memset(tt,0,sizeof(tt));
tt[n]=1;x=0;
for (i=1;i<=m;++i)
{
j=list[i];
for (vector<int>::iterator it=v[j].begin();it!=v[j].end();++it)
if ((C[*it][j]!=F[*it][j]) && (!tt[*it]))
{tt[*it]=1;
if (*it!=1) list[++m]=*it;
} else
if ((C[*it][j]==F[*it][j]) && (viz[*it]))
C[0][++x]=poz[*it][j];
}
sort(C[0]+1,C[0]+x+1);
printf("%d\n",x);
for (i=1;i<=x;++i)
printf("%d\n",C[0][i]);
return 0;
}