Cod sursa(job #2386806)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 23 martie 2019 18:13:46
Problema Critice Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>
#define maxn 1000
#define maxm 10000
#define inf INT_MAX/2-1
#define pii pair<int,int>
#define fi first
#define se second
//#define aaa system("pause");

using namespace std;

struct yes {int z1, z2, ind;};

vector <int> g[maxn+5];
vector <int> way;
vector <yes> cand;
vector <int> crit;
int _cap[maxn+5][maxn+5], _flx[maxn+5][maxn+5];
bool viz[maxn+5];
int flag;
int n, m;

void _reset () { for ( int i = 0; i < n; i++ ) viz[i] = 0; }

void dfs ( int nod )
{
  int i, sz = g[nod].size(), nn;
  viz[nod] = 1;
  way.push_back (nod);
  if ( nod == n - 1 ) { flag = 1; return; }
  for ( i = 0; i < sz && flag == 0; i++ )
  {
    nn = g[nod][i];
    if ( viz[nn] == 0 && _flx[nod][nn] < _cap[nod][nn] ) dfs (nn);
  }
  if ( flag == 0 ) way.pop_back();
}

void dfs2 ( int nod )
{
  viz[nod] = 1;
  if ( viz[0] == 1 && viz[n-1] == 1 ) return;
  int i, sz = g[nod].size(), nn;
  for ( i = 0; i < sz; i++ )
  {
    nn = g[nod][i];
    if ( viz[nn] == 0 && max(_flx[nn][nod],_flx[nod][nn]) < _cap[nod][nn] ) dfs2 (nn);
  }
}

int main ()
{
  ifstream fin ( "critice.in" );
  ofstream fout ( "critice.out" );

  fin >> n >> m;

  int i, j, z, a, b, c, sz, delta, aux;
  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> c; a--; b--;
    g[a].push_back (b); _cap[a][b] = c;
    g[b].push_back (a); _cap[b][a] = c;
  }

  dfs (0);
  while ( flag == 1 )
  {
    delta = inf;
    sz = way.size();
    for ( i = 0; i < sz-1; i++ ) delta = min (delta,_cap[way[i]][way[i+1]] - _flx[way[i]][way[i+1]]);
    for ( i = 0; i < sz-1; i++ ) _flx[way[i]][way[i+1]] += delta, _flx[way[i+1]][way[i]] -= delta;
    _reset(); way.clear();
    flag = 0; dfs (0);
  }

  fin.close(); fin.open ( "critice.in" ); fin >> n >> m;
  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> c; a--; b--;
    if ( _flx[a][b] == _cap[a][b] ) cand.push_back ( {a,b,i} );
    else if ( _flx[b][a] == _cap[b][a] ) cand.push_back ( {b,a,i} );
  }

  for ( i = 0; i < cand.size(); i++ )
  {
    cout << cand[i].ind + 1 << '\n';
    _reset();
    _cap[cand[i].z1][cand[i].z2]++;
    dfs2 ( cand[i].z1 );
    _cap[cand[i].z1][cand[i].z2]--;
    if ( viz[0] == 1 && viz[n-1] == 1 ) crit.push_back(1+cand[i].ind);
  }

  sort ( crit.begin(), crit.end() );
  fout << crit.size() << '\n';
  for ( i = 0; i < crit.size(); i++ ) fout << crit[i] << '\n';

  fin.close ();
  fout.close ();

  return 0;
}