Cod sursa(job #2652207)

Utilizator victorzarzuZarzu Victor victorzarzu Data 24 septembrie 2020 16:10:20
Problema Critice Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 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, nr;
int C[1005][1005], TT[1005], C1[1005][1005];
vector<int> graf[1005], rez; bool viz[1005];
vector<muchie> muc;
vector<int> drumuri[1005];

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];
}

void maximum_flow()
{
  int fmin;
  nr = 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; 
      }

      ++nr;
      for(nod = n;nod != 1;nod = TT[nod])
        drumuri[nr].push_back(nod);
      drumuri[nr].push_back(1);
    }
  }
}

void Solve()
{
  maximum_flow();
  memset(viz, false, sizeof(viz));
  int nr_max = 0;
  
  for(int i = 1;i <= nr;++i)
    {
      muchie neck = make_pair(-1, -1);
      nr_max = 0;
      for(int j = 0;j < drumuri[i].size() - 1;++j)
        if(!C[drumuri[i][j + 1]][drumuri[i][j]] || !C[drumuri[i][j]][drumuri[i][j + 1]])
          {
            ++nr_max;
            neck = make_pair(drumuri[i][j + 1], drumuri[i][j]);
          }
        else if(nr_max > 1)
          break;
      if(nr_max != 1)
        continue; 
      if(find(muc.begin(), muc.end(), make_pair(neck.e1, neck.e2)) != muc.end())
        nr_max = (find(muc.begin(), muc.end(), make_pair(neck.e1, neck.e2)) - muc.begin()) + 1;
      else if(find(muc.begin(), muc.end(), make_pair(neck.e2, neck.e1)) != muc.end())
        nr_max = (find(muc.begin(), muc.end(), make_pair(neck.e2, neck.e1)) - muc.begin()) + 1;
        if(!viz[nr_max])
          rez.push_back(nr_max), viz[nr_max] = true;
    }
  g<<rez.size()<<'\n';
  for(auto it : rez)
    g<<it<<'\n';
}

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