Pagini recente » Cod sursa (job #1249837) | Cod sursa (job #227701) | Cod sursa (job #1367890) | Cod sursa (job #1035858) | Cod sursa (job #783534)
Cod sursa(job #783534)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
const int Nmax = 1011;
const int Mmax = 10011;
const int oo=1<<30;
vector<int> Leg[Nmax];
vector< pair<int,int> > Muchii;
int Cap[Nmax][Nmax];
int Dad[Nmax],cd[Nmax];
int Marked[Nmax];
int Marked2[Nmax];
int Fmin,Co,N,M;
vector<int> St;
ifstream F("critice.in");
ofstream G("critice.out");
int BF()
{
int i, j, nod, V;
cd[0] = 1;
cd[1] = 1;
memset(Marked, 0, sizeof(Marked));
Marked[1] = 1;
for (i = 1; i <= cd[0]; i++)
{
nod = cd[i];
if (nod == N) continue;
for (j = 0; j < int(Leg[nod].size()); j++)
{
V = Leg[nod][j];
if ( Cap[nod][V]==0 || Marked[V]) continue;
Marked[V] = 1;
cd[ ++cd[0] ] = V;
Dad[V] = nod;
}
}
return Marked[N];
}
void BF2()
{
int i, j, nod, V;
cd[0] = 1;
cd[1] = N;
Marked2[N] = 1;
for (i = 1; i <= cd[0]; i++)
{
nod = cd[i];
if (nod == 1) continue;
for (j = 0; j < int( Leg[nod].size() ); j++)
{
V = Leg[nod][j];
if ( Cap[nod][V]==0 || Marked2[V]) continue;
Marked2[V] = 1;
cd[ ++cd[0] ] = V;
Dad[V] = nod;
}
}
}
int main()
{
F>>N>>M;
for (int i=1;i<=M;++i)
{
int x,y,c;
F>>x>>y>>c;
Leg[x].push_back( y );
Leg[y].push_back( x );
Cap[x][y]=c;
Cap[y][x]=c;
Muchii.push_back( make_pair( x,y ) );
}
while ( BF() )
for ( int i=0;i<int( Leg[N].size() );++i )
{
int Nod=Leg[N][i];
if ( Cap[Nod]==0 || !Marked[Nod] ) continue;
Dad[N]=Nod;
Fmin=oo;
for (int Act=N; Act!=1; Act=Dad[Act] )
Fmin=min( Fmin, Cap[ Dad[Act] ][Act] );
if ( Fmin == 0 ) continue;
for (int Act = N; Act != 1; Act = Dad[Act])
{
Cap[ Dad[Act] ][Act] -= Fmin;
Cap[Act][ Dad[Act] ] += Fmin;
}
}
BF();
BF2();
for (int i=0;i<M;++i)
{
int j=Muchii[i].first;
int k=Muchii[i].second;
if ( ( (Marked[j] && Marked2[k]) || (Marked[k] && Marked2[j]) ) && ( !Cap[j][k] || !Cap[k][j] ) )
++Co,St.push_back( i+1 );
}
G<<Co<<'\n';
for (int i=0;i<Co;++i)
G<<St[i]<<'\n';
}