Cod sursa(job #2652049)

Utilizator victorzarzuZarzu Victor victorzarzu Data 24 septembrie 2020 09:27:26
Problema Critice Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
#define muchie pair<int, int>
#define e1 first
#define e2 second

using namespace std;
ifstream f("critice.in");
ofstream g("critice.out");
int n, m, x, y, cap;
int C[1005][1005], TT[1005], C1[1005][1005];
vector<int> graf[1005], rez;
bool viz[1005];
vector<muchie> muc;

void Read()
{
  f>>n>>m;
  for(int i = 1;i <= m;++i)
  {
    f>>x>>y>>cap;
    graf[x].push_back(y); graf[y].push_back(x);
    C[x][y] = C[y][x] = cap;
    muc.push_back(make_pair(x, y));
  }
}

bool bfs()
{
  memset(viz, false, sizeof(viz));
  viz[1] = true;
  queue<int> q;
  q.push(1);

  while(!q.empty())
  {
    int nod = q.front();
    q.pop();

    if(nod == n) continue;

    for(auto it : graf[nod])
    {
      if(viz[it] || C[nod][it] == 0) continue;
      viz[it] = true;
      q.push(it);
      TT[it] = nod;
    }
  }
  return viz[n];
}

int maximum_flow()
{
  int fmin, flow = 0;
  for(;bfs();)
  {
    for(auto it : graf[n])
    {
      int nod = it;

      if(C[nod][n] == 0 || !viz[nod]) continue;

      TT[n] = nod; 
      fmin = oo;

      for(nod = n; nod != 1;nod = TT[nod])
        fmin = min(fmin, C[TT[nod]][nod]);

      if(fmin == 0) continue;

      for(nod = n;nod != 1;nod = TT[nod])
      {
        C[TT[nod]][nod] -= fmin;
        C[nod][TT[nod]] += fmin; 
      }

      flow += fmin;
    }
  }
  return flow;
}

void Solve()
{
  maximum_flow();
  int nr = 0;
  bool ok;
  for(auto it : muc)
  {
    ++nr;
    ok = false;
    ++C[it.e1][it.e2];
    if(bfs())
      ok = true;
    --C[it.e1][it.e2];
    if(!ok)
    {
      ++C[it.e2][it.e1];
      if(bfs())
        ok = true;
      --C[it.e2][it.e1];
    }
    if(ok)
      rez.push_back(nr);
  }
  g<<rez.size()<<'\n';
  for(auto it : rez)
    g<<it<<'\n';
}

int main()
{
  Read();
  Solve();
  return 0;
}