Pagini recente » Cod sursa (job #1385226) | Cod sursa (job #392571) | Cod sursa (job #841504) | Cod sursa (job #2814097) | Cod sursa (job #572760)
Cod sursa(job #572760)
#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, viz_st, viz_fi;
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();
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 j = 0 ; j < G[nod].size() ; ++j)
{
int V = G[nod][j];
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, bitset<Max_N> &v)
{
Q[ 0 ] = 1;
Q[ 1 ] = S;
v[ S ] = true;
for(int i = 1 ; i <= Q[ 0 ] ; ++i)
{
int nod = Q[i];
for(unsigned j = 0 ; j < G[nod].size() ; ++j)
{
int V = G[nod][j];
if(v[ V ] || F[ nod ] [ V ] == C[ nod ] [ V ] || F[ V ] [ nod ] == C[ V ] [ nod ])continue;
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;
}
}
bf(1, viz_st);
bf(N, viz_fi);
for( int i = 1 ; i <= M ; ++i)
if((viz_st[m[i].first] && viz_fi[m[i].second]) || (viz_st[m[i].second] && viz_fi[m[i].first]))
sol[++sol[0]] = i;
printf("%d\n", sol[0]);
for(int i = 1 ; i <= sol[ 0 ] ; ++i)
printf("%d\n", sol[i]);
return 0;
}