Cod sursa(job #2763998)

Utilizator Bogdan5146Private Bogdan5146 Data 18 iulie 2021 15:29:25
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>

class Solution {
public:
      static constexpr size_t MaxNodesNum = 100;

      Solution& ReadDataFrom(const char *filePath) {
            std::ifstream fin(filePath);
            fin >> m_NodesNum;

            for (size_t i = 0; i < m_NodesNum; i++) {
                  for (size_t j = 0; j < m_NodesNum; j++) {
                        fin >> m_Matrix[i][j];
                  }
            }
            fin.close();

            return *this;
      }

      Solution& Compute() {
            for (size_t k = 0; k < m_NodesNum; k++) {
                  for (size_t i = 0; i < m_NodesNum; i++) {
                        if (!m_Matrix[i][k])
                              continue;

                        for (size_t j = 0; j < m_NodesNum; j++) {
                              if (!m_Matrix[k][j] || i == j)
                                    continue;

                              if (m_Matrix[i][k] + m_Matrix[k][j] < m_Matrix[i][j] || !m_Matrix[i][j])
                                    m_Matrix[i][j] = m_Matrix[i][k] + m_Matrix[k][j];
                        }
                  }
            }

            return *this;
      }

      Solution& WriteDataTo(const char *filePath) {
            std::ofstream fout(filePath);

            for (size_t i = 0; i < m_NodesNum; i++) {
                  for (size_t j = 0; j < m_NodesNum; j++) {
                        fout << m_Matrix[i][j] << " ";
                  }
                  fout << std::endl;
            }
            fout.close();

            return *this;
      }

private:
      size_t m_NodesNum;
      int m_Matrix[MaxNodesNum][MaxNodesNum];
};

int main() {
      Solution().ReadDataFrom("royfloyd.in").Compute().WriteDataTo("royfloyd.out");
      return 0;
}