Cod sursa(job #2652094)

Utilizator victorzarzuZarzu Victor victorzarzu Data 24 septembrie 2020 11:59:08
Problema Critice Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 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(C[it.e1][it.e2] == 1 && bfs())
      ok = true;
    --C[it.e1][it.e2];
    if(!ok)
    {
      ++C[it.e2][it.e1];
      if(C[it.e2][it.e1] == 1 && 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;
}