Pagini recente » Cod sursa (job #1916773) | Cod sursa (job #640083) | Cod sursa (job #509346) | Cod sursa (job #1143112) | Cod sursa (job #357590)
Cod sursa(job #357590)
#include <algorithm>
#include <vector>
using namespace std;
#define DIM ( 1<<10 )
#define INF ( 1<<30 )
#define pb push_back
#define sz size()
struct muchie {
int x, y, frecv;
};
int n, m, dest, nrsol, cd[ DIM ], tat[ DIM ], viz[ DIM ], cst[ DIM ][ DIM ];
muchie muc[ 10*DIM ];
vector<int> vec[ DIM ];
inline int min( int x, int y ) {
if( x < y )
return x;
return y;
}
void init_viz() {
int i;
for( i = 1; i <= n; ++i )
viz[ i ] = 0;
}
int bf() {
int st, dr, aux, nod;
unsigned int cnt;
init_viz();
cd[ 0 ] = 1;
viz[ 1 ] = 1;
for( st = dr = 0; st <= dr; ++st ) {
nod = cd[ st ];
if( nod != n ) {
for( cnt = 0; cnt < vec[ nod ].sz; ++cnt ) {
aux = vec[ nod ][ cnt ];
if( !viz[ aux ] && cst[ nod ][ aux ] > 0 ) {
cd[ ++dr ] = aux;
tat[ aux ] = nod;
viz[ aux ] = 1;
}
}
}
}
return viz[ n ];
}
int df( int nod ) {
int aux;
unsigned int cnt;
if( nod == dest )
return 1;
for( cnt = 0; cnt < vec[ nod ].sz; ++cnt ) {
aux = vec[ nod ][ cnt ];
if( !viz[ aux ] && cst[ nod ][ aux ] > 0 ) {
viz[ aux ] = 1;
if( df( aux ) )
return 1;
}
}
return 0;
}
void read() {
int i, cst0;
scanf( "%d %d", &n, &m );
for( i = 1; i <= m; ++i ) {
scanf( "%d %d %d", &muc[ i ].x, &muc[ i ].y , &cst0 );
cst[ muc[ i ].x ][ muc[ i ].y ] += cst0;
cst[ muc[ i ].y ][ muc[ i ].x ] += cst0;
vec[ muc[ i ].x ].pb( muc[ i ].y );
vec[ muc[ i ].y ].pb( muc[ i ].x );
}
}
void solve() {
int i, nod, fmin;
unsigned int cnt;
while( bf() )
for( cnt = 0; cnt < vec[ n ].sz; ++cnt ) {
nod = vec[ n ][ cnt ];
if( viz[ nod ] && cst[ nod ][ n ] > 0 ) {
fmin = INF;
tat[ n ] = nod;
for( nod = n; nod != 1; nod = tat[ nod ] )
fmin = min( fmin, cst[ tat[ nod ] ][ nod ] );
if( fmin )
for( nod = n; nod != 1; nod = tat[ nod ] ) {
cst[ tat[ nod ] ][ nod ] -= fmin;
cst[ nod ][ tat[ nod ] ] += fmin;
}
}
}
for( i = 1; i <= m; ++i ) {
if( !cst[ muc[ i ].x ][ muc[ i ].y ] ) {
init_viz();
dest = muc[ i ].x;
if( df( 1 ) ) {
init_viz();
dest = n;
if( df( muc[ i ].y ) ) {
++nrsol;
muc[ i ].frecv = 1;
}
}
}
if( !cst[ muc[ i ].y ][ muc[ i ].x ] ) {
init_viz();
dest = muc[ i ].y;
if( df( 1 ) ) {
init_viz();
dest = n;
if( df( muc[ i ].x ) ) {
++nrsol;
muc[ i ].frecv = 1;
}
}
}
}
printf( "%d\n", nrsol );
for( i = 1; i <= m; ++i )
if( muc[ i ].frecv )
printf( "%d\n", i );
}
int main() {
freopen( "critice.in", "r", stdin );
freopen( "critice.out", "w", stdout );
read();
solve();
return 0;
}