Pagini recente » Cod sursa (job #2962108) | Cod sursa (job #1117011) | Cod sursa (job #1813171) | Cod sursa (job #529270) | Cod sursa (job #2195193)
#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;
}