Pagini recente » Istoria paginii runda/oji20091112 | Cod sursa (job #630598) | Cod sursa (job #2025221) | Cod sursa (job #1101296) | Cod sursa (job #1994542)
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#include <cstring>
#define dim 100005
#define INF 0x3f3f3f3f
using namespace std;
vector<pair <int,int> >G[dim];
int n,m,x,y,c,a,t,start_node,dist[dim];
void read();
int dijkstra(int nod);
int main()
{
read();
return 0;
}
void read(){
fstream fin("distante.in",ios::in);
fstream fout("distante.out",ios::out);
fin >> t;
for(int i=1;i<=t;++i){
fin >> n >> m >> start_node;
for(int j=1;j<=n;++j)
fin >> dist[j];
for(int j=1;j<=m;++j){
fin >> x >> y >> c;
G[x].push_back(make_pair(y,c));
}
if(dist[start_node] != 0)
fout << "NU\n";
else if(dijkstra(start_node) == 0)
fout << "NU\n";
else fout << "DA\n";
for(int j=1;j<=n;++j)
G[j].erase(G[j].begin(),G[j].end());
}
fin.close();
fout.close();
}
int dijkstra(int nod){
int cont = 1;
set<pair <int,int> >Set;
Set.insert(make_pair(0,nod));
while(!Set.empty()){
int node = Set.begin()->second;
int distance = Set.begin()->first;
Set.erase(Set.begin());
for(vector<pair<int,int> >::iterator it = G[node].begin(); it != G[node].end();++it){
int y = it->first;
int c = it->second;
if(dist[y] > dist[node] + c)
return 0;
if(dist[y] == dist[node] + c)
cont++;
}
}
return cont == n-1;
}