Cod sursa(job #2690760)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 25 decembrie 2020 17:23:11
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include<cstdio>
#include<set>
using namespace std;
const int N=50001,M=250001,I=1<<30;
set<pair<int,int>> c;
int n,m,d[N],i,j,a[M],b[M],e[M],*s[N],*v[N],w[N];
int main()
{
	freopen("dijkstra.in","r",stdin),freopen("dijkstra.out","w",stdout),scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
    	scanf("%d%d%d",a+i,b+i,e+i),w[a[i]]++;
	for(i=1;i<=n;d[i]=I,w[i++]=0)
		s[i]=new int[w[i]],v[i]=new int[w[i]];
	for(i=1;i<=m;i++)
    	s[a[i]][w[a[i]]]=b[i],v[a[i]][w[a[i]]++]=e[i];
	for(d[1]=0,c.insert({0,1});!c.empty();)
		for(i=c.begin()->second,c.erase(c.begin()),j=0;j<w[i];j++)
            if(d[i]+v[i][j]<d[s[i][j]])
            {
                if(d[s[i][j]]!=I)
                    c.erase(c.find({d[s[i][j]],s[i][j]}));
                d[s[i][j]]=d[i]+v[i][j],c.insert({d[s[i][j]],s[i][j]});
            }
	for(i=2;i<=n;i++)
        printf("%d ",d[i]==I?0:d[i]);
}