Pagini recente » Cod sursa (job #88128) | Cod sursa (job #2560540) | Cod sursa (job #2108251) | Cod sursa (job #703077) | Cod sursa (job #318538)
Cod sursa(job #318538)
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define maxn 1010
long n, i, m, j, k, a, b, x, l, r, ok, nod, size;
long c[maxn][maxn], nrm[maxn][maxn], up[maxn], f[maxn], coa[maxn], coa1[maxn], coa2[maxn], sol[maxn];
long min(long a, long b)
{
if(a>b) return b;
return a;
}
int main()
{
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
c[i][j]=-1;
}
}
for(i=1; i<=m; i++)
{
scanf("%d %d %d", &a, &b, &x);
c[a][b]=x;
c[b][a]=x;
nrm[a][b]=i;
nrm[b][a]=i;
}
ok=1;
while(ok)
{
for(i=1; i<=n; i++)
{
f[i]=0;
up[i]=-1;
}
f[1]=11100;
coa[1]=1;
for(l=1, r=1; l<=r; l++)
{
nod=coa[l];
for(i=1; i<=n; i++)
{
if(f[i]==0 && c[nod][i]>0)
{
f[i]=min(f[nod], c[nod][i]);
up[i]=nod;
r++;
coa[r]=i;
}
}
if(f[n]>0) break;
}
nod=n;
if(f[n]>0)
{
ok=1;
while(up[nod]!=-1)
{
i=up[nod];
c[nod][i]+=f[n];
c[i][nod]-=f[n];
nod=up[nod];
}
}
else ok=0;
}
coa1[1]=1;
f[1]=1;
memset(f, 0, sizeof(f));
for(l=1, r=1; l<=r; l++)
{
nod=coa1[l];
for(i=1; i<=n; i++)
{
if(nrm[nod][i]>0 && c[nod][i]>0 && f[i]==0)
{
r++;
coa1[r]=i;
f[i]=1;
}
}
}
/* for(i=1; i<=r; i++)
{
printf("%d ", coa1[i]);
}
printf("\n");*/
coa1[0]=r;
coa2[1]=n;
memset(f, 0, sizeof(f));
for(l=1, r=1; l<=r; l++)
{
nod=coa2[l];
f[nod]=1;
for(i=1; i<=n; i++)
{
if(nrm[i][nod]>0 && c[i][nod]>0 && f[i]==0)
{
r++;
coa2[r]=i;
f[i]=1;
}
}
}
/* for(i=1; i<=r; i++)
{
printf("%d ", coa2[i]);
}
printf("\n");*/
coa2[0]=r;
sol[0]=0;
for(i=1; i<=coa1[0]; i++)
{
for(j=1; j<=coa2[0]; j++)
{
if(nrm[coa1[i]][coa2[j]]>0 && c[coa1[i]][coa2[j]]==0 && c[coa2[j]][coa1[i]]>0)
{
sol[0]++;
sol[sol[0]]=nrm[coa1[i]][coa2[j]];
}
}
}
size=sol[0];
sort(sol+1, sol+size+1);
printf("%d\n", sol[0]);
for(i=1; i<=sol[0]; i++)
{
printf("%d\n", sol[i]);
}
return 0;
}