Pagini recente » Cod sursa (job #2469539) | Cod sursa (job #2335219) | Cod sursa (job #1688094) | Cod sursa (job #1727617) | Cod sursa (job #2828371)
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
const int inf = 0x3f3f3f3f;
#define nmax 50005
#define mmax 100005
#define cmax 1005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector <pair<int,int>> la[nmax];
int dist[nmax];
//set <pair<int,int>> s;
void dijkstra(int ns){
// Se seteaza vectorul de distante minime cu inf
memset(dist, inf, sizeof(dist));
dist[ns]=0;
int viz[nmax]={0};
viz[ns]=1;
priority_queue <pair<int,int>> pq;
// Se adauga nodul de start in set
pq.push(make_pair(-dist[ns],ns));
while(!pq.empty()){
pair<int, int> top = pq.top();
int nod = top.second;
int dmin = -top.first;
pq.pop();
// Pentru fiecare vecin al nodului curent se actualizeaza distanta minima
// if(viz[nod]==0){
// viz[nod]=1;
for(int k=0; k<la[nod].size(); k++){
int nod2 = la[nod][k].first;
int cost = la[nod][k].second;
if(dmin+cost< dist[nod2]){
dist[nod2] = dmin+cost;
pq.push(make_pair(-dist[nod2], nod2));
}
}
}
}
int main()
{
int t,n,m,s,x,y,c,d[nmax];
f>>t;
for(int i=0; i<t; i++){
// Citirea datelor
f>>n>>m>>s;
for(int j=1; j<=n; j++){
f>>d[j];
}
for(int k=0; k<m; k++){
f>>x>>y>>c;
la[x].push_back(make_pair(y,c));
la[y].push_back(make_pair(x,c));
}
// In vectorul dist se obtine solutia dupa apelarea functiei dijkstra()
dijkstra(s);
// Se verifica daca solutia obtinuta este aceeasi cu solutia citita din fisier
int ok=1;
for(int l=1; l<=n; l++){
if(dist[l]==inf && d[l]!=0) ok=0;
else if(dist[l]!=d[l]) ok=0;
}
if(ok) g<<"DA\n";
else g<<"NU\n";
// Se elibereaza la[nmax] pentru citirea urmatorului graf
for(int h=1; h<=n; h++){
la[h].clear();
}
}
f.close();
g.close();
return 0;
}