Pagini recente » Cod sursa (job #413221) | Cod sursa (job #2853243)
#include <bits/stdc++.h>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
#define m(i,j) la[i].v[j].first
#define val(i,j) la[i].v[j].second
#define lsize(x) la[x].v.size()
const int N=5e4+5,INF=2e4+5;
struct graf
{
vector <pair<int,int> > v; // nod & cost
bool parcurs;
} la[N];
int sol[N];
struct comparator
{
bool operator()(pair<int,int>a, pair<int,int>b)
{
return a.second>b.second;
}
};
void dijkstra(int n)
{
for(int i=2; i<=n; i++)
sol[i]=INF;
sol[1]=0;
priority_queue <pair<int,int>, vector<pair<int,int> >, comparator> pq;
pq.push(make_pair(1,0));
while(!pq.empty())
{
int nod=pq.top().first;
int distMIN=pq.top().second;
pq.pop();
if(sol[nod]>distMIN) continue;
//cout<<pq.top().first<<','<<pq.top().second<<": ";
la[nod].parcurs=1;
for(int i=0;i<lsize(nod);i++)
{
if(la[m(nod,i)].parcurs) continue;
int newDist=sol[nod]+val(nod,i);
//cout<<m(nod,i)<<','<<sol[m(nod,i)]<<'/'<<newDist<<'\n';
if(newDist<sol[m(nod,i)])
{
sol[m(nod,i)]=newDist;
pq.push(make_pair(m(nod,i),sol[m(nod,i)]));
}
}
//cout<<'\n';
}
}
int main()
{
int n,m;
in>>n>>m;
for(int i=1; i<=m; i++)
{
int a,b,c;
in>>a>>b>>c;
la[a].v.push_back(make_pair(b,c));
}
dijkstra(n);
for(int i=2; i<=n; i++)
{
if(sol[i]==INF)
sol[i]=0;
out<<sol[i]<<' ';
}
return 0;
}