Cod sursa(job #1290745)

Utilizator AnesthesicChereches Sergiu Alexandru Anesthesic Data 11 decembrie 2014 18:52:09
Problema Floyd-Warshall/Roy-Floyd Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 1005
#define inf (1<<28) // muta 1 cu 28 de biti in stanga, adica o sa vina in binar 100[25]0 aka 2^28
#define read fin
#define write fout

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

int a[nmax][nmax];
int i, j, k, x, y, n, m;

int main(){
    read >> n;
    for(i=1; i<=n; i++) // aka for i:=1 to n do // i++ echivalent cu i:=i+1; (incrementare)
        for(j=1; j<=n; j++){
            read >> a[i][j]; // citim matricea de ponderi (greutati)
            if(a[i][j]==0 && i!=j)  a[i][j] = inf; // daca a[i][j] este egal cu 0, inseamna ca avem infinit, care poate fi notat si cu (n-1) * maxWeight + 1, sau cum l-am pus eu un aprox 2*10^8.
        }

    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                a[i][j] = min(a[i][j], a[i][k]+a[k][j]); // best-ul lui a[i][j] se alege dintre muchia directa, sau drumul "auxiliar", minimul greutatii dintre ele

    for(i=1; i<=n; i++){
        for(j=1; j<=n; j++)
            if(a[i][j]== inf)   fout << 0 << " "; // daca e infinit afisam 0
            else    fout << a[i][j] << " "; // afisam matricea de drumuri minime
        fout << "\n"; // \n este egal cu new line aka writeLN.
    }

return 0;
}