Cod sursa(job #2506465)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 8 decembrie 2019 11:11:41
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include<bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
using namespace std;
typedef long long ll;
FILE *fin=fopen("dijkstra.in","r");
FILE *fout=fopen("dijkstra.out","w");
const int INF= 500*200000, N=50005;
int n, m, i, j, ans[N], x, y, z;
set<pair<int,int> > unsv;
set<pair<int,int> > ::iterator it, it2;
vector<pair<int,int> > v[N];
bool queued[N], used[N];
void dijk(int nod)
{
	unsv.insert({0,1});
	while(!unsv.empty())
	{
		it=unsv.begin();
		nod=(*it).nd;
		used[nod]=1;
		unsv.erase(unsv.begin());
		for(auto i:v[nod])
		if(!used[i.st])
		{
//			cout<<"{"<<ans[i.st]<<' '<<i.st<<'\n';
			if(queued[i.st])
			{
				it=unsv.find({ans[i.st],i.st});
				ans[i.st]=min(ans[i.st],ans[nod]+i.nd);
				unsv.insert({ans[i.st],i.st});
			}
			else
			{
				ans[i.st]=min(ans[i.st],ans[nod]+i.nd);
				queued[i.st]=1;
				unsv.insert({ans[i.st],i.st});
			}
//			cout<<ans[i.st]<<' '<<i.st<<"}\n";
		}
	}
}
int main()
{
	fscanf(fin,"%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		fscanf(fin,"%d%d%d",&x,&y,&z);
		v[x].pb({y,z});
		v[y].pb({x,z});
	}
	for(i=2;i<=n;i++)
		ans[i]=INF;
	dijk(1);
	for(i=2;i<=n;i++)
	{
		if(ans[i]==INF)
			fprintf(fout,"0 ");
		else fprintf(fout,"%d ",ans[i]);
	}
	fprintf(fout,"\n");
	fclose(fin);
	fclose(fout);
}