Cod sursa(job #2972139)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 28 ianuarie 2023 18:28:14
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>
#include <memory>

using namespace std;

class Solver{
private:
  int N;
  vector<vector<int>> DP;
  const int INF = 0x3f3f3f3f;
public:
  Solver(){
    freopen("royfloyd.in", "r", stdin);
    freopen("royfloyd.out", "w", stdout);
  }
  ~Solver(){
    fclose(stdin);
    fclose(stdout);
  }
  void readData() {
    scanf("%d", &N);
    DP.resize(N, vector<int>(N, 0));
    for (int i = 0; i < N; ++i)
      for (int j = 0; j < N; ++j) {
	scanf("%d", &DP[i][j]);
	if (DP[i][j] == 0) // no path
	  DP[i][j] = INF;
      }
  }
  void calculateRoyFloyd() {
    for (int k = 0; k < N; ++k) // optimization node
      for (int i = 0; i < N; ++i)
	if (i != k)
	  for (int j = 0; j < N; ++j)
	    if (j != k && j != i)
	      if (DP[i][j] > DP[i][k] + DP[k][j])
		DP[i][j] = DP[i][k] + DP[k][j];
  }
  void printRoyFloyd() {
    for (int i = 0; i < N; ++i) {
      for (int j = 0; j < N; ++j)
	if (DP[i][j] >= INF)
	  printf("0 ");
	else
	  printf("%d ", DP[i][j]);
      printf("\n");
    }
  }
};

int main()
{
  unique_ptr<Solver> s = make_unique<Solver>();
  s->readData();
  s->calculateRoyFloyd();
  s->printRoyFloyd();
  return 0;
}