Pagini recente » Cod sursa (job #2369207) | Cod sursa (job #3185424) | Cod sursa (job #709054) | Cod sursa (job #2785786) | Cod sursa (job #146203)
Cod sursa(job #146203)
# include <stdio.h>
# include <string>
using namespace std;
# define input "critice.in"
# define output "critice.out"
# define max 1001
# define maxM 10001
# define min(a,b) (a<b?a:b)
# define abs(a) (a<0?-a:a)
# define INF 11111
int f[max][max],a[max][max],i,j,n,m,t[max],coada[max],rez[max],nr;
int x,y,c,r,k;
struct muchie
{
int x,y;
}canal[maxM];
int bf(int s,int d)
{
coada[1] = s;
memset(t,0,sizeof(t));
t[1] = -1;
int st, dr;
st=dr=1;
while(st<=dr)
{
i=coada[st];
for(j=1;j<=n;j++)
if(!t[j])
if( a[i][j] > f[i][j])
{
coada[++dr] = j;
t[j] = i;
if(j == d) return 1;
}
else
if(f[j][i] > 0)
{
coada[++dr] = j;
t[j] = -i;
if ( j == d ) return 1;
}
st++;
}
return 0;
}
int main()
{
freopen(input,"r",stdin);
freopen(output,"w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
a[x][y] = c;
a[y][x] = c;
canal[i].x=x;
canal[i].y=y;
}
while(bf(1,n))
{
r = INF;
i=n;
while(i!=1)
{
j = t[i];
if(j < 0)
r = min(r,f[i][-j]);
else
r = min( r,a[j][i] - f[j][i]);
i=abs(j);
}
i = n;
while(i!=1)
{
j = t[i];
if(j < 0)
f[i][-j] -= r;
else
f[j][i] += r;
i = abs(j);
}
}
for(k=1;k<=m;k++)
{
a[canal[k].x][canal[k].y]++;
a[canal[k].y][canal[k].x]++;
if(bf(1,n))
{
rez[++nr] = k;
}
a[canal[k].x][canal[k].y]--;
a[canal[k].y][canal[k].x]--;
}
printf("%d\n",nr);
for(i=1;i<=nr;i++)
printf("%d\n",rez[i]);
return 0;
}