Pagini recente » Cod sursa (job #1311485) | Cod sursa (job #256068)
Cod sursa(job #256068)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nmax 1005
#define nx 10005
#define min(x,y) ((x)<(y)?(x):(y))
int flux[nmax][nmax], cap[nmax][nmax], X[nmax],Y[nmax];
int n, m, x, y, z;
int tat[nmax],*A[nmax],grad[nmax];
int bfs()
{
int Q[nmax];
memset(tat,0,sizeof(tat));
Q[1]=1;
tat[1]=1;
for (int e=1,u=1;e<=u;e++)
{
int t=Q[e];
for (int i=1;i<=A[t][0];++i)
if (!tat[A[t][i]] && cap[t][A[t][i]]>flux[t][A[t][i]])
{
tat[A[t][i]]=t;
Q[++u]=A[t][i];
if (A[t][i]==n)
return 1;
}
}
return 0;
}
void bfs1()
{
int Q[nmax];
memset(tat,0,sizeof(tat));
Q[1]=tat[1]=1;
for (int e=1,u=1;e<=u;++e)
{
int t=Q[e];
for (int i=1;i<=A[t][0];++i)
if (!tat[A[t][i]] && cap[t][A[t][i]]>flux[t][A[t][i]])
{
tat[A[t][i]]=1;
Q[++u]=A[t][i];
}
}
}
void bfs2()
{
int Q[nmax];
Q[1]=n;
tat[n]=2;
for (int e=1,u=1;e<=u;++e)
{
int t=Q[e];
for (int i=1;i<=A[t][0];++i)
if (tat[A[t][i]]!=2 && cap[A[t][i]][t]>flux[A[t][i]][t])
{
tat[A[t][i]]=2;
Q[++u]=A[t][i];
}
}
}
void flux_maxim()
{
int r,j;
while (bfs())
for (int i = 1; i <= n; i++)
{
if (tat[i] <= 0 || cap[i][n] <= flux[i][n])
continue;
r = cap[i][n] - flux[i][n];
for (j = i; j != 1; j = tat[j])
r = min(r, cap[tat[j]][j] - flux[tat[j]][j]);
if (!r)
continue;
flux[i][n] += r;
flux[n][i] -= r;
for (j = i; j != 1; j = tat[j])
{
flux[tat[j]][j] += r;
flux[j][tat[j]] -= r;
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d", &n, &m);
int i,k;
for (i = 1; i <= m; i++)
{
scanf("%d %d %d", &x, &y, &z);
cap[x][y] = z;
cap[y][x] = z;
X[i]=x;
Y[i]=y;
grad[x]++;
++grad[y];
}
for (i=1;i<=n;++i)
{
A[i]=(int*)malloc((grad[i]+1)*sizeof(int));
A[i][0]=0;
}
for (i=1;i<=m;++i)
{
A[X[i]][++A[X[i]][0]]=Y[i];
A[Y[i]][++A[Y[i]][0]]=X[i];
}
flux_maxim();
k=0;
bfs1();bfs2();
for (i=1;i<=m;++i)
if (tat[X[i]]+tat[Y[i]]==3)
++k;
printf("%d\n",k);
for (i=1;i<=m;++i)
if (tat[X[i]]+tat[Y[i]]==3)
printf("%d\n",i);
fclose(stdin);
fclose(stdout);
return 0;
}