Cod sursa(job #1374148)

Utilizator IonutLLuca Ionut IonutL Data 4 martie 2015 23:24:42
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include<vector>
using namespace std;

int n;

ifstream f("royfloyd.in");
ofstream g("royfloyd.out");

 vector <pair<int,int> > lista[50005];
vector<pair<int,int> >::iterator it;

void citire()
{int x;
f >> n;
for(int i=1; i<=n; i++)
    for(int j=1; j<=n; j++)
        {f >>x;
         lista[i].push_back(make_pair(j,x));
        }
}

int verif(int x, int y) //daca exista
{
for(it=lista[x].begin();it!=lista[x].end();it++)
    if(it->first==y) return 1;

return 0;

}


int val(int x, int y) //val drum x->y
{
    for(it=lista[x].begin();it->first!=y;it++)
        {
        }
return it->second;
}

void modif(int x, int y, int a,int b)
{ for(it=lista[x].begin();it->first!=y;it++)
        {
        }
  it->second=a+b;
}

void royFloyd()
{
for(int k=1; k<=n; k++)
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
/*incerc sa merg de la nodul i la nodul j prin nodul k
  daca de la i la k si de la k la j exista drum
  si drumul direct de la i la j costa mai mult decat suma drumurilor de la i la k si de la k la j
  sau nu existra drum de la i la j
  si i este diferit de j
  atunci costul drumului de la i la j va fi suma costurilor drumurilor de la i la k si de la k la i;
  */
            if (verif(i,k) && verif(k,j) && (val(i,j) > val(i,k) + val(k,j) || !verif(i,j)) && i != j)
                modif(i,j,val(i,k),val(k,j));


}

void afisare()
{for(int i=1;i<=n;i++)
    {for(it=lista[i].begin();it!=lista[i].end(); it++)
        g<<it->second<<" ";
     g<<'\n';
    }
}

int main()
{
citire();
royFloyd();
afisare();
return 0;
}