Pagini recente » Cod sursa (job #996772) | Cod sursa (job #3208614) | Cod sursa (job #2035931) | Cod sursa (job #2159087) | Cod sursa (job #255989)
Cod sursa(job #255989)
#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], poz[nmax][nmax];
int n, m, x, y, z,w;
int tat[nmax];
struct ek
{
int e1,e2,pos;
};
ek Q[nx];
int compare (const void *a,const void *b)
{
return (((ek*)a)->pos-((ek*)b)->pos);
}
int bfs(int s, int d)
{
int que[nmax];
memset(tat,0,sizeof(tat));
tat[que[0] = 1] = -1;
for (int p = 0, u = 0; p <= u; p++)
for (int i = 1, nod = que[p]; i <= n; i++)
if (!tat[i] && cap[nod][i] > flux[nod][i])
{
tat[que[++u] = i] = nod;
if (i == d)
return 1;
}
return 0;
}
int bfs1(int d1,int d2)
{
int que[nmax];
memset(tat,0,sizeof(tat));
tat[que[0] = 1] = 1;
for (int p = 0, u = 0; p <= u; p++)
for (int i = 1, nod = que[p]; i < n; i++)
if (!tat[i] && cap[nod][i] > flux[nod][i] || d1==1 || d2==1)
{
tat[que[++u] = i] = 1;
if (i == d1)
return d2;
if (i==d1)
return d2;
}
return 0;
}
int bfs2(int s)
{
if (!s) return 0;
int que[nmax];
que[0]=s;
tat[s]=1;
for (int p=0,u=0; p<=u;++p)
for (int i=1,nod=que[p];i<=n;++i)
if (!tat[i] && cap[nod][i]>flux[nod][i])
{
tat[que[++u]=i]=1;
if (i == n)
return 1;
}
return 0;
}
int flux_maxim()
{
int r,j;
for (; bfs(1, n); )
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;
if (flux[i][n]==cap[i][n] && cap[i][n])
{ Q[++w].e1=i;
Q[w].e2=n;
Q[w].pos=poz[i][n]; }
for (j = i; j != 1; j = tat[j])
{
flux[tat[j]][j] += r;
flux[j][tat[j]] -= r;
if (flux[tat[j]][j]==cap[tat[j]][j] && cap[tat[j]][j])
{ Q[++w].e1=tat[j];
Q[w].e2=j;
Q[w].pos=poz[tat[j]][j]; }
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d", &n, &m);
int k=0,i;
for (i = 0; i < m; i++)
{
scanf("%d %d %d", &x, &y, &z);
cap[x][y] = z;
cap[y][x] = z;
poz[x][y] = ++k;
poz[y][x] = k;
}
flux_maxim();
k=0;
int asd[nmax]={0};
qsort(Q,w+1,sizeof(ek),compare);
for (i=1;i<=w;++i)
if (bfs2(bfs1(Q[i].e1,Q[i].e2)))
asd[++k]=i;
printf ("%d\n",k);
for (i=1;i<=k;++i)
printf("%d\n",Q[asd[i]].pos);
fclose(stdin);
fclose(stdout);
return 0;
}