Pagini recente » Cod sursa (job #979812) | Cod sursa (job #743108) | Cod sursa (job #1600816) | Cod sursa (job #1375368) | Cod sursa (job #952697)
Cod sursa(job #952697)
#include <fstream>
#include <vector>
#include <cstring>
#define MAXN 1011
using namespace std;
int N, M;
vector <int> muchii[MAXN];
int viz[MAXN];
int TT[MAXN];
int cd[MAXN];
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int Indice[MAXN][MAXN];
vector <int> Ans;
void Citire ()
{
ifstream fin ("critice.in");
fin >> N >> M;
for (int i = 1, A, B, c; i <= M; i++)
{
fin >> A >> B >> c;
muchii[A].push_back (B);
muchii[B].push_back (A);
C[A][B] = C[B][A] = c;
Indice[A][B] = Indice[B][A] = i;
}
fin.close ();
}
int BFS ()
{
cd[cd[0] = 1] = 1;
memset (viz, 0, sizeof (viz));
viz[1] = 1;
for (int i = 1; i <= cd[0]; i++)
{
int nod = cd[i];
if (nod == N) continue;
for (int j = 0; j < muchii[nod].size (); j++)
{
int V = muchii[nod][j];
if (viz[V] || C[nod][V] == F[nod][V]) continue;
viz[V] = 1;
cd[++cd[0]] = V;
TT[V] = nod;
}
}
return viz[N];
}
void Bag_flux ()
{
while (BFS ())
{
for (int i = 0; i < muchii[N].size (); i++)
{
int V = muchii[N][i];
if (!viz[V] || C[V][N] == F[V][N]) continue;
int fmin = 2000000000;
TT[N] = V;
for (int nod = N; nod != 1; nod = TT[nod])
if (fmin > C[TT[nod]][nod] - F[TT[nod]][nod]) fmin = C[TT[nod]][nod] - F[TT[nod]][nod];
if (fmin == 0) continue;
for (int nod = N; nod != 1; nod = TT[nod])
{
F[TT[nod]][nod] += fmin;
F[nod][TT[nod]] -= fmin;
}
}
}
}
vector <int> G1;
vector <int> G2;
void BF1 ()
{
cd[cd[0] = 1] = 1;
memset (viz, 0, sizeof (viz));
viz[1] = 1;
for (int i = 1; i <= cd[0]; i++)
{
int nod = cd[i];
for (int j = 0; j < muchii[nod].size (); j++)
{
int V = muchii[nod][j];
if (viz[V] || C[nod][V] - F[nod][V] <= 0) continue;
viz[V] = 1;
G1.push_back (V);
cd[++cd[0]] = V;
}
}
}
void BF2 ()
{
cd[cd[0] = 1] = N;
memset (viz, 0, sizeof (viz));
viz[N] = 1;
for (int i = 1; i <= cd[0]; i++)
{
int nod = cd[i];
for (int j = 0; j < muchii[nod].size (); j++)
{
int V = muchii[nod][j];
if (viz[V] || C[V][nod] - F[V][nod] <= 0) continue;
viz[V] = 1;
G2.push_back (V);
cd[++cd[0]] = V;
}
}
}
void Scriere ()
{
ofstream fout ("critice.out");
for (int i = 0; i < G1.size (); i++)
{
int x = G1[i];
for (int j = 0; j < G2.size (); j++)
{
int y = G2[j];
if (C[x][y] && C[x][y] - F[x][y] == 0)
Ans.push_back (Indice[x][y]);
}
}
fout << Ans.size () << "\n";
for (int i = 0; i < Ans.size (); i++)
fout << Ans[i] << "\n";
fout.close ();
}
int main ()
{
Citire ();
Bag_flux ();
G1.push_back (1);
G2.push_back (N);
BF1 ();
BF2 ();
Scriere ();
return 0;
}