Pagini recente » Borderou de evaluare (job #1222538) | Cod sursa (job #1222516)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define NMAX 10005
#define MMAX 100005
vector <int> r,v[NMAX];
queue <int> q;
pair <int,int> a[MMAX];
int n,m,x,y,c,minim,C[NMAX][NMAX],F[NMAX][NMAX],T[NMAX],U[NMAX];
int bfs()
{
int i;
memset(T,0,sizeof(T));
T[1]=-1;
q.push(1);
while (!q.empty())
{
x=q.front(); q.pop();
for (i=0;i<v[x].size();++i)
{
y=v[x][i];
if (!T[y] && C[x][y]>F[x][y])
{
T[y]=x;
q.push(y);
}
}
}
return T[n];
}
void bfs1()
{
int i;
U[n]=-1;
q.push(n);
while (!q.empty())
{
x=q.front(); q.pop();
for (i=0;i<v[x].size();++i)
{
y=v[x][i];
if (!U[y] && C[x][y]>-F[x][y])
{
U[y]=x;
q.push(y);
}
}
}
}
int main()
{
int i;
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
a[i]=make_pair(x,y);
v[x].push_back(y);
v[y].push_back(x);
C[x][y]=C[y][x]=c;
}
while (bfs())
{
for (i=0;i<v[n].size();++i)
{
x=v[n][i];
if (T[x])
{
minim=C[x][n]-F[x][n];
y=x;
while (T[y]!=-1)
{
minim=min(minim,C[T[y]][y]-F[T[y]][y]);
y=T[y];
}
y=x;
F[x][n]+=minim, F[n][x]-=minim;
while (T[y]!=-1)
{
F[T[y]][y]+=minim, F[y][T[y]]-=minim;
y=T[y];
}
}
}
}
bfs();
bfs1();
for (i=1;i<=m;++i)
if ( (T[a[i].first] && U[a[i].second]) || (U[a[i].first] && T[a[i].second]) )
r.push_back(i);
printf("%d\n",r.size());
for (i=0;i<r.size();++i)
printf("%d\n",r[i]);
return 0;
}