Pagini recente » Cod sursa (job #2174464) | Istoria paginii runda/ooni | Cod sursa (job #607839) | Monitorul de evaluare | Cod sursa (job #2023212)
#include <iostream>
#include <fstream>
using namespace std;
const int nmax=1005;
short fl[nmax][nmax],c[nmax][nmax],q[nmax],prc[nmax],v[nmax][nmax],ans[10*nmax],vizD[nmax],A[10*nmax],B[10*nmax];
int n,m,start,nod,p,u,i,j,rez,a,b,cap,minfl;
bool bfs()
{
for(i=2;i<=n;i++)
prc[i]=0;
prc[1]=-1;q[1]=1;p=u=1;
while(p<=u)
{
start=q[p];p++;
for(i=1;i<=v[start][0];i++)
{
nod=v[start][i];
if((!prc[nod])&&fl[start][nod]<c[start][nod])
{
q[++u]=nod;
prc[nod]=start;
}
}
}
return (prc[n]!=0);
}
void dfs(int x)
{
vizD[x]=1;
for(int i=1;i<=v[x][0];i++)
if((!vizD[v[x][i]])&&c[v[x][i]][x]>fl[v[x][i]][x])
dfs(v[x][i]);
}
int main()
{
ifstream f("critice.in");
ofstream g("critice.out");
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>a>>b>>cap;
c[a][b]=c[b][a]=cap;
v[a][++v[a][0]]=b;
v[b][++v[b][0]]=a;
A[i]=a;B[i]=b;
}
while(bfs())
{
nod=n;minfl=30000;
for(i=1;i<=v[n][0];i++)
{
nod=v[n][i];
minfl=c[nod][n]-fl[nod][n];
if(minfl&&prc[nod])
{
while(nod!=1)
{
minfl=min(minfl,c[prc[nod]][nod]-fl[prc[nod]][nod]);
nod=prc[nod];
}
nod=v[n][i];
fl[nod][n]+=minfl;
fl[n][nod]-=minfl;
while(nod!=1)
{
fl[prc[nod]][nod]+=minfl;
fl[nod][prc[nod]]-=minfl;
nod=prc[nod];
}
}
}
}
dfs(n);
for(i=1;i<=m;i++)
{
if((prc[A[i]]&&vizD[B[i]])||(vizD[A[i]]&&prc[B[i]]))
ans[++rez]=i;
}
g<<rez<<'\n';
for(i=1;i<=rez;i++)
g<<ans[i]<<'\n';
return 0;
}