Cod sursa(job #145785)

Utilizator andrei.12Andrei Parvu andrei.12 Data 29 februarie 2008 14:54:23
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<stdio.h>
#include<vector>
#include<queue>

using namespace std;

#define infinit 0x3f3f3f3f
#define pb push_back
#define lg 50005

int n, m, s, rez[lg], cnt[lg], nr[lg], i, j, teste, x, y, cst, nxt, ss;
bool fst[lg];

typedef pair<int, int> graf;
vector<graf> v[lg];
queue<int> q;

void golire(){
	for (i = 1; i <= n; i ++){
		for (j = 0; j < nr[j]; j ++)
			v[i].pop_back();
		nr[i] = 0;
	}
}
void citire(){
	int kkt = 0, j, nt;
	char sir[50];
	fgets(sir, 50, stdin), nt = 0;
	
	for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
		kkt = kkt*10+sir[j]-'0';
	x = kkt, kkt = 0;
	nt = j+1;
	for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
		kkt = kkt*10+sir[j]-'0';
	y = kkt, kkt = 0;
	nt = j+1;
	for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
		kkt = kkt*10+sir[j]-'0';
	cst = kkt;
}
int main()
{
	freopen("distante.in", "rt", stdin);
	freopen("distante.out", "wt", stdout);
	
	scanf("%d", &teste);
	for (int test = 1; test <= teste; test ++){
		scanf("%d%d%d", &n, &m, &s);
		
		for (i = 1; i <= n; i ++)
			scanf("%d", &rez[i]);
		char ch;
		scanf("%c", &ch);
		
		for (i = 1; i <= m; i ++){
			citire();
			
			nr[x] ++;
			v[x].pb(graf(y, cst));
			
			nr[y] ++;
			v[y].pb(graf(x, cst));
		}
		
		for (i = 1; i <= n; i ++)
			cnt[i] = infinit;
		
		cnt[s] = 0;
		q.push(s);
		fst[s] = true;
		
		while (!q.empty()){
			x = q.front();
			q.pop();
			
			for (i = 0; i < nr[x]; i ++){
				nxt = v[x][i].first;
				cst = v[x][i].second;
				
				if (cnt[x] + cst < cnt[nxt]){
					cnt[nxt] = cnt[x] + cst;
					
					if (!fst[nxt]){
						q.push(nxt);
						fst[nxt] = true;
					}
				}
			}
			
			fst[x] = false;
		}
		
		ss = 0;
		for (i = 1; i <= n; i ++)
			if (cnt[i] != rez[i]){
				ss = 1;
				break;
			}
		if (!ss)
			printf("DA\n");
		else
			printf("NU\n");
		
		golire();
	}
	
	return 0;
}