Cod sursa(job #485661)

Utilizator IrnukIrina Grosu Irnuk Data 19 septembrie 2010 00:35:16
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include<fstream>
#include<list>
#include<vector>
#define lg (heap.size()-1)
#define NMAX 50005
using namespace std;

long T,n,m,s;
	long ok=1;
long distanta[NMAX],vizitat[NMAX];
long long dist[NMAX];
//
//struct nod
//{
//	long vf;
//	long cost;
//	nod(long nvf,long ncost)
//	{
//		vf=nvf;
//		cost=ncost;
//	}
//};

vector<list<pair<long,long> > > G;
vector<long> heap;
long pozInHeap[NMAX];

long fiuS(long vf)
{
	return 2*vf;
}

long fiuD(long vf)
{
	return 2*vf+1;
}

void swap(long poz1, long poz2)
{
	long aux;

	aux=heap[poz1];
	heap[poz1]=heap[poz2];
	heap[poz2]=aux;
	
	aux=pozInHeap[heap[poz1]];
	pozInHeap[heap[poz1]]=pozInHeap[heap[poz2]];
	pozInHeap[heap[poz2]]=aux;
}
void moveUp(long poz)
{
	long parinte=poz/2;
	
	while(parinte>=1)
	{
		if(dist[heap[parinte]]>dist[heap[poz]])
			swap(parinte,poz);
		else
			break;
		poz=parinte;
		parinte=parinte/2;
	}
}

void moveDown(long poz)
{
	long fius,fiud;
	long pozMin;
	
	do
	{

		fius=poz*2;
		fiud=poz*2+1;
		if(fius>lg)
			break;
		if(fiud>lg || dist[heap[fius]]<dist[heap[fiud]])
			pozMin=fius;
		else
			pozMin=fiud;

		if(dist[heap[poz]]>dist[heap[pozMin]])
			swap(poz,pozMin);
		else 
			break;
		poz=pozMin;

	}while(1);
}


void dijkstra()
{
	list<pair<long,long> >::iterator itr;
	pair<long,long> que;
	long el;

	dist[s]=0;
	moveUp(s);

	while(heap.size()!=1)
	{
		el=heap[1];
		pozInHeap[heap[1]]=-1;
		pozInHeap[heap[lg]]=1;
		heap[1]=heap[lg];
		heap.pop_back();
		moveDown(1);

		if(dist[el]!=distanta[el])
		{
			ok=0;
			break;
		}
		for(itr=G[el].begin();itr!=G[el].end(); itr++)
		{
			que=*itr;
			if(dist[que.first]>dist[el]+que.second)
			{
				dist[que.first]=dist[el]+que.second;
				moveUp(pozInHeap[que.first]);
			}
		}
	}
}

int main()
{
	fstream fin,fout;
	long contT,i,x,y,c;
	list<pair<long, long> > lista;
	G.push_back(lista);

	fin.open("distante.in",ios::in);
	fout.open("distante.out",ios::out);

	fin>>T;
	
	for(contT = 0; contT < T; contT++)
	{
		fin>>n>>m>>s;
		ok=1;
		heap.push_back(0);
		G.push_back(lista);

		for(i=1;i<=n;i++)
		{
			fin>>distanta[i];
			G.push_back(lista);
			dist[i]=LONG_MAX;
			vizitat[i]=0;
			heap.push_back(i);
			pozInHeap[i]=i;
		}

		for(i=1;i<=m;i++)
		{
			fin>>x>>y>>c;
			G[x].push_back(make_pair(y,c));
			G[y].push_back(make_pair(x,c));
		}

		dijkstra();
		if(ok==1)
			fout<<"DA\n";
		else
			fout<<"NU\n";

		heap.clear();
		//for(i=0;i<=n;i++)
		//	G.pop_back();
		G.clear();
	}


	fin.close();
	fout.close();
	return 0;
}