Cod sursa(job #72690)

Utilizator Data 14 iulie 2007 22:32:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>

#include <iomanip>
#include <vector>
#include <set>
#include <iterator>
using namespace std;

#define FIN "distante.in"
#define FOUT "distante.out"
#define _INF 50000
#define MAX_N 50005

typedef vector<int> VI;
typedef VI::iterator IT;
typedef vector<bool> VB;

VI d;
VB sel, inq;
vector<VI> c;       
vector<VI>::iterator i, final;
int n, m, S;
int L;
int D[MAX_N];
int T,ii;

struct Functor {
	
	bool operator () (int i, int j)
	{
		return d[i] < d[j];
	}
};

multiset<int, Functor> Q;

void Read();
void Write();
void Dijkstra();



int main()
{
    freopen (FIN,"r",stdin);
	freopen (FOUT,"w",stdout);
	scanf("%d",&T);
    for (ii=1; ii<=T; ii++)	
    {
	scanf("%d %d %d",&n,&m,&S);
	d.resize(n + 1), 
	c.resize(n + 1);
	inq.resize(n + 1);
	for ( int i = 0; i <= n; i++ )
		c[i].resize(n + 1);
	int X;	
	for (int i=1; i<=n; i++) scanf("%d",D+i);
	for ( int i = 0; i <= n; i++ )
		c[i].assign(n  + 1, _INF);
	
	int x, y, cost;
	for ( int i = 0; i < m; ++i)
	{
		scanf("%d %d %d",&x,&y,&cost);

		c[x][y] = c[y][x] = cost;
	}
	
	for ( int i = 0; i <= n; i++ )
		c[i][i] = 0;
    Dijkstra();
	Write();		
    }		

	
	return 0;
}

void Dijkstra()
{
	d.assign(n + 1, _INF);
	d[S] = 0;
	Q.insert(S);
	inq[S] = true;
	int k;
	while ( !Q.empty() )
	{
		k = *Q.begin();
		Q.erase(Q.begin());   // sterge numai primul element, chiar daca urmatorul are aceeasi valoare pt d[]
		inq[k] = false;
		for (int i = 1; i <= n; ++i)
			if (d[i] > d[k] + c[k][i] )
			{			
				if ( inq[i] ) 
					Q.erase(i);
				else 
					inq[i] = true;
			
				d[i] = d[k] + c[k][i];
				Q.insert(i);
			}
	}
}


void Write()
{
    int ok=1;
	for ( int i = 1; i <= n; i++ )
 		if (d[i]!=D[i]) { ok=0; break; }
    if (ok) printf("DA\n"); else printf("NU\n");       
}