Pagini recente » Cod sursa (job #1984588) | Cod sursa (job #2228164) | Cod sursa (job #98390) | Cod sursa (job #1239522) | Cod sursa (job #1172639)
//complexitate O(n*n)
#include<fstream>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m,d[50003],i,x,y,j, infinit = (1<<30);
short int t[50003];
char viz[50003];
struct arc
{
short int vecin,cost;
arc *leg;
};
arc *vec[50003],*p;
int main()
{
//citirea datelor
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y>>j;
p=new arc;
p->vecin=y;
p->cost=j;
p->leg=vec[x];
vec[x]=p;
}
//algoritmul lui Dijkstra
//partea 1 - initializarea
for(i=1;i<=n;i++)
{
d[i]=infinit;
viz[i]=0;
t[i]=0;//nici un varf nu are tata
}
d[1]=0;//pornim din varful 1
//partea 2 - algoritmul propriu-zis
for (i=1;i<=n;i++)
{
x=infinit;
for(j=1;j<=n;j++)
{
if(viz[j]==0 && d[j]<x)
{
x=d[j];
y=j;
}
}
if(x==infinit)break;//s-a consumat componenta conexa
viz[y]=1;//a fost ales y, cel cu d[y] minim
for(p=vec[y];p;p=p->leg)
{
if(d[y]+p->cost < d[p->vecin])
{
d[p->vecin]=d[y]+p->cost;
t[p->vecin]=y;//s-a modificat tatal lui p->vecin
}
}
}
//partea 3 - afisarea
for (i=2;i<=n;i++)
{
if(d[i]==infinit)d[i]=0;
fout<<d[i]<<" ";
}
fout.close();
fin.close();
return 0;
}