Cod sursa(job #1342756)

Utilizator bububulmezBulmez Alexandru bububulmez Data 14 februarie 2015 14:55:57
Problema Floyd-Warshall/Roy-Floyd Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#define inf 10000
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("royfloyd.in");
ofstream g("royfloyd.out");
int n,c[50][50],pred[50][50];
void citire()
{

    f>>n;
    for(int i=1; i<n; i++)
        for(int j=i+1; j<=n; j++)
            c[i][j]=c[j][i]=inf;
    for(int i=1; i<=n; i++)
    {

        for(int j=1; j<=n; j++)
            {
            f>>c[i][j];
            if(c[i][j]>0)
                pred[i][j]=i;
            }
    }
}
void Roy_Floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(c[i][j]>c[i][k]+c[k][j])
                {
                    c[i][j]=c[i][k]+c[k][j];
                    pred[i][j]=pred[k][j];
                }
}

void afis_drum(int i,int j)
{
    if(i==j)
    {
        g<<i<<" ";
        return;
    }
    afis_drum(i,pred[i][j]);
    g<<j<<" ";
}

void afisare()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(i==j || c[i][j]==inf)
                g<<"Nu exista drum de la "<<i<<" la "<<j<<endl;
            else
            {
                g<<"Costul de la "<<i<<" la "<<j;
                g<<" este: "<<c[i][j];
                g<<" si drumul este: ";
                afis_drum(i,j);
                g<<endl;
            }
}
int main()
{
    citire();
    Roy_Floyd();
    for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
                g<<c[i][j]<<' ';
            g<<endl;
        }
    //afis_drum(1,2);
    return 0;
}