Cod sursa(job #2233798)

Utilizator mihai2003LLL LLL mihai2003 Data 24 august 2018 15:08:17
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <vector> 
#include <queue>
#include <limits.h>

const int NMAX=50001;
std::ifstream in("distante.in");
std::ofstream out("distante.out");
std::vector<int> distante;
std::vector<std::pair<int,int>> muchii[NMAX];
std::priority_queue<std::pair<int,int> , std::vector<std::pair<int,int>>,std::greater<std::pair<int,int>>> pq;
int costuri[NMAX];
bool viz[NMAX];

void dijkstra(int sursa){
	pq.push({costuri[sursa]=0,sursa});
	while(!pq.empty()){
		auto pair=pq.top();
		pq.pop();
		if(viz[pair.second])
			continue;
		viz[pair.second]=1;
		for(auto pr:muchii[pair.second])
			if(!viz[pr.first] && costuri[pr.first] > costuri[pair.second] + pr.second)
				costuri[pr.first] = costuri[pair.second] + pr.second , pq.push({costuri[pr.first],pr.first});
	}
}

int main(){
	int T,N,M,S,a,b,c;
	bool ok=0;
	in>>T;
	for(int test=0;test<T;test++){
		in>>N>>M>>S;
		ok=1;
		while(!pq.empty())
			pq.pop();
		distante.clear();
		for(int i=1;i<=N;i++)
			muchii[i].clear();
		for(int i=1;i<=N;i++)
			costuri[i]=INT_MAX/2-1,viz[i]=0;
		distante.push_back(0);
		for(int i=0;i<N;i++)
			in>>a,distante.push_back(a);
		for(int i=0;i<M;i++)
			in>>a>>b>>c,muchii[a].push_back({b,c}),muchii[b].push_back({a,c});
		dijkstra(S);
		for(int i=1;i<=N;i++)
			if(costuri[i]!=distante[i])
				ok=0;
		if(!ok)
			out<<"NU\n";
		else
			out<<"DA\n";
	}
	return 0;
}