Pagini recente » Cod sursa (job #736981) | Cod sursa (job #2785123) | Cod sursa (job #2165061) | Cod sursa (job #805633) | Cod sursa (job #43590)
Cod sursa(job #43590)
# include <stdio.h>
# include <string>
using namespace std;
# define input "critice.in"
# define output "critice.out"
# define max 1001
# 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,st,dr,k;
struct muchie
{
int x,y;
}canal[max];
int min(int x,int y)
{
return x > y ? y : x;
}
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] && a[i][j] > f[i][j])
{
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;
}
st=1,dr=n;
while(bf(st,dr))
{
r = INF;
i=dr;
while(i!=st)
{
r=min(r,a[t[i]][i]-f[t[i]][i]);
i=t[i];
}
i=dr;
while(i!=st)
{
f[t[i]][i]+=r;
i=t[i];
}
}
for(k=1;k<=m;k++)
{
x= canal[k].x;
y= canal[k].y;
if(f[x][y] == a[x][y])
{
int ok=0;
if(x!=1)
ok+=bf(1,x);
else
ok++;
if(y!=n)
ok+=bf(y,n);
else
ok++;
if(ok == 2)
rez[++nr] = k;
}
else
if(f[y][x] == a[x][y])
{
int ok=0;
if(y!=1)
ok+=bf(1,y);
else
ok++;
if(x!=n)
ok+=bf(x,n);
else
ok++;
if(ok == 2)
rez[++nr] = 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;
}