Pagini recente » Cod sursa (job #355355) | Cod sursa (job #1176200) | Cod sursa (job #1435563) | Cod sursa (job #1316769) | Cod sursa (job #1546864)
#include <fstream>
#include <vector>
#include <set>
#include <bitset>
#define DIM 100005
#define INF (1 << 30)
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int N, M, source, numberVertiges;
int D[DIM], D2[DIM], a, b, c, T;
pair< int, int > p;
bitset< DIM >v;
vector<pair < int, int> > L[DIM];
//folosesc set pentru complexitate de timp(este un arbore binar de cautare )
// cu minimul in cea mai din stanga frunza
set <pair <int, int> > s;
bool dijkstra(int source)
{
if(D2[source] != 0)
{
return false;
}
// initializez distantele de la sursa la noduri cu infinit
for(int i = 1; i <= N; i ++)
{
D[i] = INF;
}
D[source] = 0;
s.insert(make_pair(source, 0));
numberVertiges = 0;
while(numberVertiges <= N)
{
if(s.empty())
{
break;
}
p = *s.begin(); // iau minimul
s.erase(s.begin()); // si il scot din set
numberVertiges ++;
v[p.first] = 1; // marchez ca fiind vizitat
for(vector <pair <int, int> >::iterator it = L[p.first].begin(); it != L[p.first].end(); it ++)
{
if(D[it -> first] > D[p.first] + it -> second)
{
s.erase(make_pair(it -> first, D[it -> first]));
D[it -> first] = D[p.first] + it -> second;
s.insert(make_pair(it -> first, D[it -> first]));
}
}
}
for(int i = 1; i <= N; i ++)
{
if(D[i] != D2[i])
{
return false;
}
}
return true;
}
int main()
{
fin >> T;
while(T --)
{
fin >> N >> M >> source;
for(int i = 1; i <= N; i ++)
{
fin >> D2[i];
}
for(int i = 1; i <= M; i ++)
{
fin >> a >> b >> c;
L[a].push_back(make_pair(b, c));
L[b].push_back(make_pair(a, c));
}
if(dijkstra(source))
{
fout << "DA\n";
}
else
{
fout << "NU\n";
}
for(int i = 1; i <= N; i ++)
{
L[i].erase(L[i].begin(), L[i].end());
v[i] = 0;
D[i] = 0;
D2[i] = 0;
}
}
return 0;
}