Cod sursa(job #936256)

Utilizator Kira96Denis Mita Kira96 Data 6 aprilie 2013 13:44:18
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<fstream>
#include<string.h>
#include<vector>
#define NM 51000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int D[NM],H[NM],P[NM],V[NM],n,i,t,nod,L,m,s,x,y,c;
vector<int> C[NM];
vector<int> N[NM];
void urca(),coboara(),read(),solve(),dele();
int main ()
{
	f>>t;
	while(t--)
	{
		read();
		dele();
		solve();
	}
	return 0;
}
void urca(int po)
{
	while(po&&D[H[po]]<D[H[po>>1]])
	{
		swap(H[po],H[po>>1]);
		swap(P[H[po]],P[H[po>>1]]);
		po>>=1;
	}
}
void coboara(int po)
{
	int po1;
	while(po1!=po)
	{
		po1=po;
		if((po1<<1)<=L&&D[H[po1<<1]]<D[H[po]])
			po1=po<<1;
		if((po<<1)+1<=L&&D[H[(po<<1)+1]]<D[H[po1]])
			po1=(po<<1)+1;
		swap(H[po],H[po1]);
		swap(P[H[po]],P[H[po1]]);
	}
}
void dele()
{
	int inf=1<<25;
	memset(H,0,n);
	memset(P,0,n);
	for(i=1;i<=n;++i)
		D[i]=inf;
}
void read()
{
	for(i=1;i<=n;++i)
	{
		N[i].clear();
		C[i].clear();
	}
	f>>n>>m>>s;
	for(i=1;i<=n;++i)
		f>>V[i];
	for(i=1;i<=m;++i)
	{
		f>>x>>y>>c;
		if(x==y)
			continue;
		N[x].push_back(y);
		C[x].push_back(c);
		N[y].push_back(x);
		C[y].push_back(c);
	}
}
void solve()
{
	D[s]=0;
	H[1]=s; P[1]=1;
	L++;
	while(L)
	{
		nod=H[1];
		H[1]=H[L--];
		P[H[1]]=1;
		coboara(1);
		for(i=0;i<C[nod].size();++i)
		{
			int cos=C[nod][i];
			int des=N[nod][i];
			if(D[nod]+cos<D[des])
			{
				D[des]=D[nod]+cos;
				if(P[des])
					urca(P[des]);
				else
				{
					++L;
					H[L]=des;
					P[H[L]]=L;
					urca(L);
				}
			}
		}
	}
	for(i=1;i<=n;++i)
	{
		if(D[i]!=V[i]){
			g<<"NU\n"; return; }
	}
	g<<"DA\n";
}