Cod sursa(job #2195192)

Utilizator gabriel-mocioacaGabriel Mocioaca gabriel-mocioaca Data 15 aprilie 2018 16:26:11
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <list>
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
#include <Fstream>
using namespace std;
#define INF 0x3f3f3f3f
#define cin in
#define cout out
typedef pair<int, int> iPair;

class Graph
{
	int V;

	list< pair<int, int> > *adj;

public:
	Graph(int V);

	void addEdge(int u, int v, int w);

	vector<int> shortestPath(int s);
};

Graph::Graph(int V)
{
	this->V = V;
	adj = new list<iPair>[V];
}

void Graph::addEdge(int u, int v, int w)
{
	adj[u].push_back(make_pair(v, w));
	adj[v].push_back(make_pair(u, w));
}

vector<int> Graph::shortestPath(int src)
{
	priority_queue< iPair, vector <iPair>, greater<iPair> > pq;

	vector<int> dist(V, INF);

	pq.push(make_pair(0, src));
	dist[src] = 0;

	while (!pq.empty())
	{
		
		int u = pq.top().second;
		pq.pop();

		list< pair<int, int> >::iterator i;
		for (i = adj[u].begin(); i != adj[u].end(); ++i)
		{
			int v = (*i).first;
			int weight = (*i).second;

			if (dist[v] > dist[u] + weight)
			{
				dist[v] = dist[u] + weight;
				pq.push(make_pair(dist[v], v));
			}
		}
	}
	return dist;
}



int main()
{
	ifstream in("distante.in");
	ofstream out("distante.out");
	int t;
	cin >> t;
	for (int i = 0; i < t; ++i) {
		int n, m, s, x, y, c;
		cin >> n >> m >> s;
		Graph g(n);
		vector<int> prop_sol(n);
		vector<int> act_sol;

		for (int k = 0; k < n; ++k) {
			cin >> prop_sol[k];
		}

		for (int k = 1; k <= m; ++k) {
			cin >> x >> y >> c;
			g.addEdge(x-1, y-1, c);
		}

		act_sol = g.shortestPath(s-1);

		bool mistake = false;

		for (int k = 0; k < n; ++k) {
			if (prop_sol[k] != act_sol[k]) {
				mistake = true;
				break;
			}
		}
		if (!mistake)cout << "DA";
		else cout << "NU";
	}
	in.close();
	out.close();
	return 0;
}