Pagini recente » Cod sursa (job #1960464) | Cod sursa (job #19366) | Rating Andrei Costinescu (naruto96) | Cod sursa (job #2422048) | Cod sursa (job #593374)
Cod sursa(job #593374)
/* dijkstra cu heap-uri */
#include <cstdio>
#include <queue>
using namespace std;
const int INF = 2000000000;
const int N = 50005;
struct nod_dest
{
int destinatie,cost;
};
priority_queue < pair<int,int>, vector < pair<int,int> >, greater <pair<int,int> > > heap;
int n,start;
vector<nod_dest> vecin[N];
int d[N]; int nevizitate; bool vizitat[N];
int d_rasp[N];
void citire_graf()
{
int m,a,b,c;
scanf("%d%d%d",&n,&m,&start);
for (int i = 1; i <= n; ++i)
scanf("%d",&d_rasp[i]);
for (int i = 1; i <= m; ++i)
{
scanf("%d%d%d",&a,&b,&c);
vecin[a].push_back((nod_dest){b,c});
vecin[b].push_back((nod_dest){a,c});
}
}
void initializare_dijkstra()
{
while (!heap.empty())
heap.pop();
for (int i = 1; i <= n; ++i)
d[i] = INF;
d[start] = 0;
heap.push(make_pair(0,start));
nevizitate = n-1;
for (int i = 1; i <= n; ++i)
vizitat[i] = false;
}
void dijkstra()
{
int nod,dest,dist_noua;
initializare_dijkstra();
while (nevizitate > 0)
{
while (!heap.empty() && vizitat[heap.top().second])
heap.pop();
nod = heap.top().second;
for (unsigned int i = 0; i < vecin[nod].size(); ++i)
{
dest = vecin[nod][i].destinatie;
dist_noua = d[nod] + vecin[nod][i].cost;
if (d[dest] > dist_noua)
{
d[dest] = dist_noua;
heap.push(make_pair(dist_noua,dest));
}
}
heap.pop();
vizitat[nod] = true;
--nevizitate;
}
}
bool raspunsuri_corecte()
{
for (int i = 1; i <= n; ++i)
if (d[i] != d_rasp[i])
return false;
return true;
}
int main()
{
int t;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for (int i = 1; i <= t; ++i)
{
citire_graf();
dijkstra();
printf(raspunsuri_corecte()?"DA\n":"NU\n");
}
return 0;
}