Pagini recente » Cod sursa (job #1247211) | Cod sursa (job #1002816) | Solutii preONI 2007, Runda 3 | Cod sursa (job #2570321) | Cod sursa (job #796838)
Cod sursa(job #796838)
// Include
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
// Definitii
#define edge pair<int, int>
#define cost first
#define node second
#define pb push_back
#define mp make_pair
// Constante
const int sz = 50000;
const int oo = (1<<30)-1;
// Variabile
ifstream in("distante.in");
ofstream out("distante.out");
int tests;
int nodes, edges, startNode;
int dist[sz], initDist[sz];
vector<edge> graph[sz];
vector<edge>::iterator it, end;
priority_queue<edge> heap;
// Main
int main()
{
in >> tests;
for(int test=1 ; test<=tests ; ++test)
{
if(test>1)
{
for(int i=1 ; i<=nodes ; ++i)
graph[i].clear();
}
in >> nodes >> edges >> startNode;
for(int i=1 ; i<=nodes ; ++i)
in >> initDist[i], dist[i] = oo;
int rFrom, rTo, rCost;
for(int i=1 ; i<=edges ; ++i)
{
in >> rFrom >> rTo >> rCost;
graph[rFrom].pb(mp(rCost, rTo));
graph[rTo].pb(mp(rCost, rFrom));
}
dist[startNode] = 0;
heap.push(mp(0, startNode));
while(!heap.empty())
{
edge current = heap.top();
heap.pop();
end = graph[current.node].end();
for(it=graph[current.node].begin(); it!=end ; ++it)
if(current.cost + it->cost < dist[it->node])
{
dist[it->node] = current.cost + it->cost;
heap.push(mp(dist[it->node], it->node));
}
}
bool correct = true;
for(int i=1 ; i<=nodes ; ++i)
if(dist[i] != initDist[i])
{
correct=false;
break;
}
out << (correct? "DA":"NU") << '\n';
}
in.close();
out.close();
return 0;
}