Cod sursa(job #1170630)

Utilizator RazvanR104Razvan-Andrei Ciocoiu RazvanR104 Data 13 aprilie 2014 22:43:51
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

#include <algorithm>
#include <bitset>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#if __cplusplus > 199711L
#include <unordered_map>
#include <unordered_set>
#endif

#include <cmath>
#include <cstring>
#include <cstdlib>

using namespace std;

const int inf = 0x3f3f3f3f;

int N;
int GR[110][110], R[110][110];
queue<int> Q;
bool inside[110];

int main()
{
    int i, j, node;

	ifstream fin("royfloyd.in");
	ofstream fout("royfloyd.out");

    memset(R, inf, sizeof(R));

	fin >> N;

	for (i = 1; i <= N; ++i)
        for (j = 1; j <= N; ++j)
            fin >> GR[i][j];

    for (i = 1; i <= N; ++i)
    {
        memset(inside, 0, sizeof(inside));

        Q.push(i);
        inside[i] = true;

        while(!Q.empty())
        {
            node = Q.front();
            inside[node] = false;
            Q.pop();

            R[i][i] = 0;

            for (j = 1; j <= N; ++j)
            {
                if (GR[node][j] && R[i][j] > R[i][node] + GR[node][j])
                {
                    R[i][j] = R[i][node] + GR[node][j];

                    if (!inside[j])
                    {
                        Q.push(j);
                        inside[j] = true;
                    }
                }
            }
        }
    }

    for (i = 1; i <= N; ++i, fout << '\n')
        for (j = 1; j <= N; ++j)
            fout << ((R[i][j] == inf) ? (0) : (R[i][j])) << ' ';

	fout.close();
    return 0;
}