Cod sursa(job #713953)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 15 martie 2012 10:29:33
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include<fstream>
using namespace std;
#define lung 50001
#define inf 1 << 30
ifstream fin("distante.in");
ofstream fout("distante.out");
struct nod{int val,cost;
           nod *next;
};
nod *v[lung],*q;
int i,t,n,m,k,h[lung],d[lung],poz[lung],rasp[lung],start;
inline void downheap(int x)
{int fiu;
	while (x <= k)
 	{   fiu = x;
	    if ((x<<1) <= k)
		{   fiu = x << 1;
		    if (fiu+1 <= k && d[h[fiu+1]] < d[h[fiu]])
				++fiu;
		}
		else
			break;
		if (d[h[fiu]] < d[h[x]])
		{   poz[h[fiu]] = x;
		    poz[h[x]] = fiu;
			h[fiu] = h[fiu] + h[x] - (h[x] = h[fiu]);
			x = fiu;
		}
		else
			break;
	}
}
inline void upheap(int x)
{int tata;
	while (x > 1)
	{   tata = x >> 1;
	    if (d[h[tata]] > d[h[x]])
		{   poz[h[x]] = tata;
		    poz[h[tata]] = x;
			h[x] = h[x] + h[tata] - (h[tata] = h[x]);
			x = tata;
		}
		else
			x = 1;
	}
}
inline void dijkstra()
{int minim;
	for (i=1;i<=n;++i)
	{   d[i] = inf;
	    poz[i] = -1;
	}
	poz[start] = 1;
	h[1] = start;
	d[start] = 0;
	++k;
	while (k)
	{   minim = h[1];
	    h[1] = h[1] + h[k] - (h[k] = h[1]);
		poz[h[1]] = 1;
		--k;
		downheap(1);
		q = v[minim];
		while (q)
		{   if (d[q->val] > d[minim] + q->cost)
			{   d[q->val] = d[minim] + q->cost;
		        if (poz[q->val] != -1)
                    upheap(poz[q->val]);
				else
				{   h[++k] = q->val;
				    poz[h[k]] = k;
					upheap(k);
				}
			}
			q = q -> next;
		}
	}
}
int main()
{int a,b,c;
    fin >> t;
    while (t--)
	{   fin >> n >> m >> start;
	    for (i=1;i<=n;++i)
			fin >> rasp[i];
		
	    for (i=1;i<=m;++i)
		{   fin >> a >> b >> c;
		    q = new nod;
			q -> next = v[a];
			q -> val = b;
			q -> cost = c;
			v[a] = q;
			q = new nod;
			q -> val = a;
			q -> cost = c;
			q -> next = v[b];
		    v[b] = q;
		}
		k=0;
		dijkstra();
		for (i=1;i<=n;++i)
			v[i] = NULL;
		for (i=1;i<=n && rasp[i] == d[i];++i);
		if (i==n+1)
			fout << "DA" << '\n';
		else
			fout << "NU " << '\n';
	}
	return 0;
}