Cod sursa(job #1427601)

Utilizator MciprianMMciprianM MciprianM Data 2 mai 2015 17:07:51
Problema Distante Scor 0
Compilator cpp Status done
Runda utcn_grafuri_training Marime 1.54 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

static const int INF = 1000000000;
static const int MAXN = 50001;
typedef pair<int, int> pii;

int dist[MAXN];
bool done[MAXN];

void Dijkstra(const vector<vector<pii>>& G, int src) {
	memset(dist, 0x3F, sizeof(dist));
	memset(done, 0, sizeof(done));
	priority_queue<pii, vector<pii>, greater<pii>> q;
	dist[src] = 0;
	q.push(pii(0, src));
	while(!q.empty()) {
		pii crt = q.top();
		q.pop();
		if(!done[crt.second]) {
			done[crt.second] = true;
			for(int i = 0, l = G[crt.second].size(); i < l; i++) {
				if(dist[G[crt.second][i].first] > dist[crt.second] + G[crt.second][i].second) {
					dist[G[crt.second][i].first] = dist[crt.second] + G[crt.second][i].second;
					q.push(pii(dist[G[crt.second][i].first], G[crt.second][i].first));
				}
			}
		}
	}
}

int main() {
	int t;
	ifstream f("distante.in");
	ofstream g("distante.out");
	f >> t;
	for(int i = 0; i < t; i++) {
		int n, m, s, a, b, c;
		f >> n >> m >> s;
		s--;
		vector<int> dz(n);
		vector<vector<pii>> G(n, vector<pii>());
		for(int j = 0; j < n; j++) {
			f >> dz[j];
		}
		for(int j = 0; j < m; j++) {
			f >> a >> b >> c;
			a--; b--;
			G[a].push_back(pii(b, c));
			G[b].push_back(pii(a, c));
		}
		Dijkstra(G, s);
		bool are_equal = true;
		for(int j = 0; j < n; j++) {
			if(dz[j] != dist[j]) {
				are_equal = false;
				break;
			}
		}
		if(are_equal) {
			g << "DA\n";
		}
		else {
			g << "NU\n";
		}
	}
	f.close();
	g.close();
	return 0;
}