Pagini recente » Cod sursa (job #136440) | Cod sursa (job #1094945) | Cod sursa (job #2479302) | Cod sursa (job #3141356) | Cod sursa (job #963054)
Cod sursa(job #963054)
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std ;
ifstream fin("critice.in");
ofstream fout("critice.out");
#define maxn 1005
#define maxm 10005
#define inf ( 1 << 30 )
struct muchie
{
int a, b ;
};
int N, M ;
muchie muchii[maxm] ;
vector <int> graf[maxn] ;
int cap[maxn][maxn], flux[maxn][maxn] ;
int tata[maxn] ;
bool sel[maxn], viz[maxn][2] ;
queue<int> coada ;
int sol[maxm] ;
bool bfs()
{
coada.push(1) ;
memset( sel, false, sizeof(sel) ) ;
sel[1] = true ;
while( coada.empty() == false )
{
int nod = coada.front() ;
coada.pop() ;
for(size_t i = 0; i < graf[nod].size(); ++i )
{
int vecin = graf[nod][i] ;
if( cap[nod][vecin] == flux[nod][vecin] || sel[vecin] )
continue ;
sel[vecin] = true ;
tata[vecin] = nod ;
if( vecin != N )
coada.push( vecin ) ;
}
}
return sel[N] ;
}
void dfs(int nod, int tip)
{
viz[nod][tip] = true ;
for(size_t i = 0; i < graf[nod].size(); ++i )
{
int vecin = graf[nod][i] ;
if( viz[vecin][tip] == false && flux[nod][vecin] < cap[nod][vecin] )
dfs( vecin, tip ) ;
}
}
int main()
{
fin >> N >> M ;
for(int i = 1; i <= M; ++i )
{
int cost ;
fin >> muchii[i].a >> muchii[i].b >> cost ;
cap[ muchii[i].a ][ muchii[i].b ] = cost ;
cap[ muchii[i].b ][ muchii[i].a ] = cost ;
graf[ muchii[i].a ].push_back( muchii[i].b ) ;
graf[ muchii[i].b ].push_back( muchii[i].a ) ;
}
while( bfs() )
{
for(size_t i = 0; i < graf[N].size(); ++i )
{
int nod = graf[N][i] ;
if( flux[nod][N] == cap[nod][N] || sel[nod] == false )
continue ;
tata[N] = nod ;
int val = inf ;
nod = N ;
while( nod != 1 )
{
val = min( val, cap[ tata[nod] ][nod] - flux[ tata[nod] ][nod] ) ;
nod = tata[nod] ;
}
nod = N ;
while( nod != 1 )
{
flux[ tata[nod] ][nod] += val ;
flux[nod][ tata[nod] ] -= val ;
nod = tata[nod] ;
}
}
}
dfs( 1, 0 ) ;
dfs( N, 1 ) ;
int nrsol = 0 ;
for(int i = 1; i <= M; ++i )
{
int nod1 = muchii[i].a ;
int nod2 = muchii[i].b ;
if( ( flux[nod1][nod2] == cap[nod1][nod2] && viz[nod1][0] && viz[nod2][1] ) || ( flux[nod2][nod1] == cap[nod2][nod1] && viz[nod2][0] && viz[nod1][1] ) )
sol[ ++nrsol ] = i ;
}
fout << nrsol << "\n" ;
for(int i = 1; i <= nrsol; ++i )
fout << sol[i] << "\n" ;
return 0 ;
}