Pagini recente » Cod sursa (job #2085512) | Cod sursa (job #1309746) | Cod sursa (job #494058) | Cod sursa (job #2289933) | Cod sursa (job #1592836)
//Dijkstra
#include<iostream>
#include<fstream>
#define NMAX 50000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const float PInfinit=1.e20;
float a[50000][5000], d[NMAX+5], minim;
int n,m,s[NMAX+5],t[NMAX+5],poz;
// D=vectorul lungimii drumurilor de la varful 1 la toate celelalte varfuri
// T=indica drumurile gasite intre nodul 1 si celelalte, T[r]=0
// S=vectorul nodurilor selectate (1 sau 0)
void citire()
{
int i,j;
float c; // c = cost pondere
fin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i!=j)
a[i][j] = PInfinit;
for(int p=1;p<=m;++p)
{
fin>>i>>j>>c;
a[i][j] = c;
}
}
/*
void afisare_mat_pond()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
*/
int main()
{
citire();
//afisare_mat_pond();
s[1] = 1; ///marcam nodul 1 ca vizitat
for(int i=1;i<=n;++i)
{
d[i] = a[1][i];
if(i!=1)
if(d[i] < PInfinit)
t[i] = 1;
}
for(int i=1;i<n;++i)
{
minim = PInfinit;
for(int j=1;j<=n;++j)
if(s[j] == 0) //Daca nu e selectat/vizitat
if(d[j] < minim)
{
minim = d[j];
poz = j;
}
s[poz] = 1;
for(int j=1;j<=n;++j)
if(s[j] == 0)
if(d[j] > d[poz] + a[poz][j]) //caut nodul final
{
d[j] = d[poz] + a[poz][j];
t[j] = poz;
}
}
for(int i=2;i<=n;++i)
if(t[i] != 0)
fout<<d[i]<<" ";
else
fout<<0<<" ";
return 0;
}