Pagini recente » Cod sursa (job #2374106) | Cod sursa (job #2894426) | Cod sursa (job #985016) | Cod sursa (job #1067384) | Cod sursa (job #531547)
Cod sursa(job #531547)
#include <cstdio>
#include <vector>
using namespace std;
#define nmax 1010
#define f first
#define s second
vector <pair<int, int> > g[nmax];
int n, m, c[nmax][nmax], f[nmax][nmax], q[nmax], t[nmax], p[2][10*nmax], u[nmax], nr, s[nmax];
int bf()
{
int i, j, nod, x, h=1;
for (i=1; i<=n; i++) u[i]=0;
q[1]=1;
u[1]=1;
for (i=1; i<=h; i++)
{
nod=q[i];
if (nod!=n)
for (j=0; j<g[nod].size(); j++)
{
x=g[nod][j].f;
if (!u[x] && c[nod][x]!=f[nod][x])
{
q[++h]=x;
u[x]=1;
t[x]=nod;
}
}
}
return u[n];
}
void df(int nod, int d)
{
u[nod]=1;
int i, x;
for (i=0; i<g[nod].size(); i++)
{
x=g[nod][i].f;
if (!u[x])
{
if (f[x][nod]==c[x][nod] || f[nod][x]==c[nod][x]) p[d][g[nod][i].s]++;
if (f[nod][x]!=c[nod][x] && f[x][nod]!=c[x][nod])
df(x, d);
}
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d %d",&n, &m);
int i, nod, x, y, fm, z;
for (i=1; i<=m; i++)
{
scanf("%d %d %d",&x, &y, &z);
g[x].push_back(make_pair(y, i));
g[y].push_back(make_pair(x, i));
c[x][y] +=z;
c[y][x] +=z;
}
while (bf())
for (i=0; i<g[n].size(); i++)
{
nod=g[n][i].f;
if (u[nod] && f[nod][n]!=c[nod][n])
{
t[n]=nod;
fm=1<<30;
nod=n;
while (t[nod])
{
x=c[t[nod]][nod]-f[t[nod]][nod];
if (x<fm) fm=x;
nod=t[nod];
}
if (fm)
{
nod=n;
while (t[nod])
{
f[t[nod]][nod] += fm;
f[nod][t[nod]] -= fm;
nod=t[nod];
}
}
}
}
for (i=1; i<=n; i++) u[i]=0;
df(1, 0);
for (i=1; i<=n; i++) u[i]=0;
df(n, 1);
for (i=1; i<=m; i++)
if (p[0][i] && p[1][i]) nr++;
printf("%d\n",nr);
for (i=1; i<=m; i++)
if (p[0][i] && p[1][i]) printf("%d\n",i);
}