Cod sursa(job #593382)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 2 iunie 2011 15:12:33
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
/* 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 <= n; ++i)
		vecin[i].clear();
	for (int i = 1; i <= m; ++i)
	{
		scanf("%d%d%d",&a,&b,&c);
		/*if (a == b)
			continue;*/
		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;
}