Cod sursa(job #2403140)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 11 aprilie 2019 12:01:19
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

int val[100005];
vector<pair<int,int> > v[50005];
queue<int> q;

int main()
{
	int noduri=0,arce=0;
	freopen("dijkstra.in","r", stdin);
	freopen("dijkstra.out","w", stdout);
	scanf("%d %d",&noduri,&arce);
	for(int i=1;i<=arce;i++)
	{
		int a,b,cost;
		scanf("%d %d %d",&a,&b,&cost);
		// leg de la a la b
		v[a].push_back(make_pair(b,cost));
	}
	for(int i=2;i<=noduri;i++)
		val[i]=1<<30;
	for(int i=1;i<=noduri;i++)
	{
		if(v[i].size())// daca am elemente la care sa merg
		{
			for(int j=0;j<v[i].size();j++)
			{
				if(val[i]+v[i][j].second < val[v[i][j].first] )//daca ajung cu un drum mai mic
				{
					val[v[i][j].first]=val[i]+v[i][j].second;
					q.push(v[i][j].first);
				}
			}
			while(q.size())
			{
				int nod=q.front();
				q.pop();
				if(v[nod].size())
				{
					for(int k=0;k<v[nod].size();k++)
					{
						if(val[nod]+v[nod][k].second<val[v[nod][k].first])
						{
							val[v[nod][k].first]=val[nod]+v[nod][k].second;
							q.push(v[nod][k].first);
						}
					}
				}
			}
		}
	}
//	printf("1 ");
	for(int i=2;i<=noduri;i++)
		(val[i]!=1<<30)?printf("%d ",val[i]):printf("0 ");
	return 0;
}