Pagini recente » Cod sursa (job #2595594) | Cod sursa (job #369018) | Cod sursa (job #2809230) | Cod sursa (job #202411) | Cod sursa (job #968328)
Cod sursa(job #968328)
#include <fstream>
#include <bitset>
#include <list>
#include <queue>
using namespace std;
#define inf 0x3f3f3f3f
int d[50005];
bitset<50005> viz;
struct elem
{
int ind;
int val;
};
list<elem> graf[50005];
bool operator<(const elem &a,const elem &b)
{
if(a.val>b.val)
return 1;
return 0;
}
int main()
{
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
priority_queue<elem> coada;
int n,m,a,b,c,i;
elem aux;
fin>>n>>m;
for(i=0;i<m;i++)
{
fin>>a>>b>>c;
aux.ind=b;
aux.val=c;
graf[a].push_back(aux);
}
for(i=2;i<=n;i++)
d[i]=inf;
aux.ind=1;
aux.val=0;
coada.push(aux);
//viz[0]=1; - fals (daca fac asa, atunci nici macar nu incepe algoritmul)
list<elem>::iterator it;
elem aux2;
while(!coada.empty())
{
aux=coada.top();
//fout<<"se extrage "<<aux.ind<<' '<<aux.val<<endl;
coada.pop();
if(!viz[aux.ind])
{
viz[aux.ind]=1;
for(it=graf[aux.ind].begin();it!=(graf[aux.ind].end());it++)
{
if((aux.val+(it->val))<d[it->ind])
{
d[it->ind]=aux.val+(it->val); //jumate
aux2.ind=it->ind;
aux2.val=d[it->ind];
coada.push(aux2);
}
}
}
}
for(i=2;i<=n;i++)
if(d[i]==inf)
fout<<"0 ";
else
fout<<d[i]<<' ';
fout<<'\n';
fin.close();
fout.close();
return 0;
}