Cod sursa(job #2771845)

Utilizator ansalecAlecu Stefan-Iulian ansalec Data 29 august 2021 15:58:39
Problema Sortare topologica Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>

using uint = unsigned int;

uint viziteaza(bool *matriceAdiacenta, uint numarNoduri,
               std::vector<bool> &vizitat, std::vector<uint> &ordine,
               uint index, uint nod) {
  if (vizitat[nod] == true)
    return index;
  vizitat[nod] = true;

  for (size_t vecin = 0; vecin < numarNoduri; vecin++) {
    if (matriceAdiacenta[nod * numarNoduri + vecin] != false && !vizitat[vecin])
      index = viziteaza(matriceAdiacenta, numarNoduri, vizitat, ordine, index,
                        vecin);
  }

  ordine[index--] = nod;

  return index;
}

std::vector<uint> sortareTopologica(bool *matriceAdiacenta, uint numarNoduri) {
  std::vector<bool> vizitat(numarNoduri, false);
  std::vector<uint> ordine(numarNoduri, 0);
  uint index = numarNoduri - 1;

  for (size_t nod = 0; nod < numarNoduri; nod++) {
    if (!vizitat[nod])
      index =
          viziteaza(matriceAdiacenta, numarNoduri, vizitat, ordine, index, nod);
  }
  return ordine;
}

int main() {
  std::ifstream inFile;
  inFile.open("sortaret.in", std::ios::in);
  if (inFile.is_open()) {
    uint numarNoduri, numarMuchii;
    inFile >> numarNoduri >> numarMuchii;

    bool *matriceAdiacenta = new bool[numarNoduri * numarNoduri];

    for (uint i = 0; i < numarNoduri; i++) {
      for (uint j = 0; j < numarNoduri; j++) {
        matriceAdiacenta[i * numarNoduri + j] = false;
      }
    }
    for (uint muchie = 0; muchie < numarMuchii; muchie++) {
      uint x, y;
      inFile >> x >> y;
      matriceAdiacenta[(x - 1) * numarNoduri + y - 1] = true;
    }
    std::ofstream outFile;
    outFile.open("sortaret.out", std::ios::out);
    if (outFile.is_open()) {
      std::vector<uint> ordine =
          sortareTopologica(matriceAdiacenta, numarNoduri);
      for (auto elem : ordine)
        outFile << elem + 1 << " ";
      outFile << "\n";
      outFile.close();
    } else {
      std::cerr << "Nu s-a putut scrie in fisier!" << std::endl;
    }
    delete[] matriceAdiacenta;
    
  } else {
    std::cerr << "Nu am putut deschide fisierul!" << std::endl;
  }
  inFile.close();
  return 0;
}