Pagini recente » Cod sursa (job #1405867) | Cod sursa (job #1378797) | Cod sursa (job #3256583) | Cod sursa (job #2982400) | Cod sursa (job #1248811)
#include <fstream>
#include <cmath>
#define inf 9999999
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int maxn = 50005;
int n, m;
int d[maxn], h[maxn], poz[maxn], k, sursa, d1[maxn];
struct graf
{
int nod, cost;
graf *urm;
};
graf *a[maxn];
void add(int where, int what, int cost)
{
graf *q = new graf;
q->nod = what;
q->cost = cost;
q->urm = a[where];
a[where] = q;
}
void citire()
{
f>>n>>m;
int x,y,z;
while(m--)
{
f>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
}
void inversare(int i, int j)
{
swap(h[i], h[j]);
poz[h[i]] = i;
poz[h[j]] = j;
}
void heap_sus(int k)
{
if (k == 1) return;
int t = k/2;
if (d[h[k]] < d[h[t]])
{
inversare(k, t);
heap_sus(t);
}
}
void heap_jos(int k, int l)
{
if (2*k <= l)
{
int i = 2*k;
if (i+1 <= l && d[h[i+1]] < d[h[i]]) i++;
if (d[h[k]] > d[h[i]])
{
inversare(k, i);
heap_jos(i, l);
}
}
}
void construire_heap(int k)
{
int i;
for (i = 1; i <= k; i++)
heap_sus(i);
}
int extrage_min()
{
int min = h[1];
inversare(1, k);
poz[h[k]] = 0;
--k;
heap_jos(1, k);
return min;
}
void dijkstra()
{
int i, j, dist;
graf *p;
for (i = 1; i <= n; i++)
{
d[i] = inf;
h[i] = i, poz[i] = i;
}
k = n;
d[sursa] = 0;
construire_heap(k);
while (k)
{
i = extrage_min();
if (d[i] != d1[i])
{
g << "NU\n";
return;
}
for (p = a[i]; p; p = p->urm)
{
j = p->nod;
dist = p->cost;
if (d[j] > d[i] + dist)
{
d[j] = d[i] + dist;
heap_sus(poz[j]);
}
}
}
g << "DA\n";
}
int main()
{
int i, j1, T, cost, m, v1, v2;
f >> T;
for (j1 = 1; j1 <= T; j1++)
{
f >> n >> m >> sursa;
for (i = 1; i <= n; i++)
f >> d1[i];
for (i = 1; i <= m; i++)
{
f >> v1 >> v2 >> cost;
add(v1, v2, cost);
add(v2, v1, cost);
}
dijkstra();
}
return 0;
}