Cod sursa(job #572714)
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;
const char in[]="critice.in";
const char out[]="critice.out";
const int Max_N = 1050;
const int INF = 0x3f3f3f3f;
#define pb push_back
#define mp make_pair
/*bitset<Max_N>viz;
bitset<Max_N>viz_st;
bitset<Max_N>viz_fi;*/
bool viz[Max_N], viz_st[Max_N], viz_fi[Max_N];
vector<int>G[Max_N];
pair<int, int> m[Max_N];
int N, M;
int F[Max_N][Max_N], C[Max_N][Max_N];
int sol[Max_N], T[Max_N], Q[Max_N];
bool BF()
{
//viz.reset();
memset(viz, 0, sizeof(viz));
Q[ 0 ] = Q[ 1 ] = 1;
viz[ 1 ] = true;
for(int i = 1 ; i <= Q[ 0 ] ; ++i)
{
int nod = Q[i];
if(nod == N) return true;
for(unsigned i = 0 ; i < G[nod].size() ; ++i)
{
int V = G[nod][i];
if(viz[ V ] || F[ nod ] [ V ] == C[ nod ] [ V ])continue;
viz[ V ] = true;
Q[ ++Q[ 0 ] ] = V;
T[ V ] = nod;
if(V == N) return true;
}
}
return false;
}
void bf(int S, bool *v)
{
Q[ 0 ] = Q[ 1 ] = S;
v[ 1 ] = true;
for(int i = 1 ; i <= Q[ 0 ] ; ++i)
{
int nod = Q[i];
for(unsigned i = 0 ; i < G[nod].size() ; ++i)
{
int V = G[nod][i];
if(!v[ V ] && (F[ nod ] [ V ] < C[ nod ] [ V ] && F[ V ] [ nod ] < C[ V ] [ nod ]))
{
v[ V ] = true;
Q[ ++Q[ 0 ] ] = V;
}
}
}
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d %d", &N, &M);
for(int i = 1 ; i <= M ; ++i)
{
int x, y, max_cap;
scanf("%d %d %d", &x, &y, &max_cap);
C[x][y] += max_cap;
C[y][x] += max_cap;
G[x].pb(y);
G[y].pb(x);
m[i] = mp(x, y);
}
while(BF())
for(unsigned i = 0 ; i < G[N].size() ; ++i)
{
int nod = G[N][i];
if(F[nod][N] == C[nod][N] || !viz[nod])continue;
int min_f = INF;
for(int i = N ; i != 1 ; i = T[i])
min_f = min(min_f, C[ T[ i ] ][ i ] - F[ T[ i ] ][ i ] );
if(!min_f)continue;
for(int i = N ; i != 1 ; i = T[i])
{
F[ T [ i ] ] [ i ] += min_f;
F[ i ] [ T [ i ] ] -= min_f;
}
}
/*Q[ 0 ] = Q[ 1 ] = 1;
viz_st[ 1 ] = true;
for(int i = 1 ; i <= Q[ 0 ] ; ++i)
{
int nod = Q[i];
for(int i = 0 ; i < G[nod].size() ; ++i)
{
int V = G[nod][i];
if(!viz_st[ V ] && F[ nod ] [ V ] < C[ nod ] [ V ])
{
viz_st[ V ] = true;
Q[ ++Q[ 0 ] ] = V;
}
}*/
bf(1, viz_st);
bf(N, viz_fi);
for( int it = 1 ; it <= N ; ++it)
if((F[ m[it].first][ m[it].second ] == C[ m[it].first][m[it].second ] &&
viz_st[ m[it].first] && viz_fi[ m[it].second]) ||
(F[ m[it].second][m[it].first ] == C[ m[it].second][ m[it].first ] &&
viz_st[ m[it].second] && viz_fi[m[it].first]))
sol[ ++sol[ 0 ] ] = it;
printf("%d\n", sol[0]);
for(int i = 1 ; i <= sol[ 0 ] ; ++i)
printf("%d\n", sol[i]);
return 0;
}