Cod sursa(job #3296621)

Utilizator andrei_sebiBalica Andrei Sebastian andrei_sebi Data 14 mai 2025 17:10:40
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int PInfinit=(1<<20);
using PI=pair<int,int>;
void Dijkstra(int nod, vector<PI>G[], vector<int>&D)
{
    priority_queue<PI,vector<PI>,greater<PI>>Q;
    D[nod]=0;
    Q.push({0,nod});
    while(!Q.empty())
    {
        int x=Q.top().first;
        int y=Q.top().second;
        Q.pop();
        if(x>D[y])
            continue;
        for(auto& q:G[y])
        {
            int nodnou=q.first;
            int costnou=q.second;
            if(D[nodnou]>D[y]+costnou)
            {
                D[nodnou]=D[y]+costnou;
                Q.push({D[nodnou],nodnou});
            }
        }
    }
}
int main()
{
   int T; in >> T;
	for(int k = 1 ; k <= T ; k++){
		int N, M, S; in >> N >> M >> S;
		vector<int> dits(N + 1);
		for(int i = 1 ; i <= N ; i++)
			in >> dits[i];
		vector <PI> G[N + 1];
		vector<int> D(N + 1, PInfinit);
		for(int i = 1 ; i <= M ; i++){
			int x, y, c; in >> x >> y >> c;
			G[x].push_back({y, c});
			G[y].push_back({x, c});
		}
		Dijkstra(S, G, D);
		int ok = 1;
		for(int i = 1 ; i <= N ; i++){
			if(D[i] != dits[i]){
				ok = 0;
				break;
			}
		}
		if(ok == 1)
			out << "DA\n";
		else
			out << "NU\n";
	}
	return 0;
}