Pagini recente » Cod sursa (job #691543) | Cod sursa (job #1941789) | Cod sursa (job #586891) | Cod sursa (job #1383792) | Cod sursa (job #1374148)
#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;
}