Pagini recente » Cod sursa (job #2834646) | Cod sursa (job #869461) | Cod sursa (job #89880) | Cod sursa (job #2186269) | Cod sursa (job #1017091)
#include<fstream>
#include<list>
#include<string>
using namespace std;
#define INF 1000000
#define min(a,b) ((a<b)?a:b)
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m;
int *viz,*dr;
struct lvertex
{
int v;
int c;
};
list<lvertex> *listd;
int getCostAt(list<lvertex> l,int v)
{
for(list<lvertex>::iterator it=l.begin();it!=l.end();it++)
{
if((*it).v==v)
return (*it).c;
}
return INF;
}
void citire()
{
fin>>n>>m;
viz=new int[n+1];
dr=new int[n+1];
memset(viz,0,(n+1)*sizeof(int));
memset(dr,0,(n+1)*sizeof(int));
listd=new list<lvertex>[n+1];
int x,y,c;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>c;
lvertex k;
k.v=y;
k.c=c;
listd[x].push_back(k);
k.v=x;
listd[y].push_back(k);
}
for(int i=1;i<=n;i++) dr[i]=INF;
fin.close();
}
void rezolva()
{
viz[1]=1;
for(list<lvertex>::iterator it=listd[1].begin();it!=listd[1].end();it++)
{
dr[(*it).v]=(*it).c;
}
int ok=1,drmin;
while(ok)
{
drmin=INF;
int poz=-1;
for(int i=1;i<=n;i++)
if(drmin>dr[i] && !viz[i])
{
drmin=dr[i];
poz=i;
}
if(drmin==INF)
ok=0;
else
{
viz[poz]=1;
for(int i=1;i<=n;i++){
int temp=getCostAt(listd[poz],i);
if(!viz[i] && temp!=INF)
{
int aux=dr[poz]+temp;
if(dr[i]>aux)
{
dr[i]=aux;
}
}
}
}
}
}
void afiseaza()
{
for (int i = 2; i <=n; ++i)
fout<<dr[i]<<" ";
fout.close();
}
int main()
{
citire();
rezolva();
afiseaza();
}