Cod sursa(job #166768)

Utilizator scvalexAlexandru Scvortov scvalex Data 28 martie 2008 14:37:58
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> edge;
typedef unsigned int uint;

int N, M, S;
uint D[50001],
 	 d[50001];
vector<edge> G[50001];

int q[50001];
int sq, eq;
bool inq[50001];

void dijkstra() {
	memset(d, -1, sizeof(d));

	sq = eq = 0;
	q[eq++] = S;
	inq[S] = true;
	d[S] = 0;
	
	while (sq != eq) {
		int u = q[sq];

		for (vector<edge>::iterator it = G[u].begin(); it != G[u].end(); ++it)
			if (d[u] + it->second < d[it->first]) {
				d[it->first] = d[u] + it->second;
				if (!inq[it->first]) {
					q[eq] = it->first;
					eq = (eq + 1) % N;
				}
			}

		sq = (sq + 1) % N;
		inq[u] = false;
	}
}

int main(int argc, char *argv[]) {
	FILE *fi = fopen("distante.in", "r");
	int T;
	fscanf(fi, "%d", &T);
	FILE *fo = fopen("distante.out", "w");
	while (T--) {
		fscanf(fi, "%d %d %d", &N, &M, &S);
		int u, v, w;
		for (int i(1); i <= N; ++i)
			G[i].clear();
		for (int i(1); i <= N; ++i)
			fscanf(fi, "%d", D + i);
		for (int i(0); i < M; ++i) {
			fscanf(fi, "%d %d %d", &u, &v, &w);
			G[u].push_back(make_pair(v, w));
			G[v].push_back(make_pair(u, w));
		}

		/*for (int i(1); i <= N; ++i) {
			cout << i << ": ";
			for (vector<edge>::iterator j = G[i].begin(); j != G[i].end(); ++j)
				cout << j->first << "(" << j->second << ") ";
			cout << endl;
		}*/

		dijkstra();

		if (memcmp(D + 1, d + 1, N * sizeof(D[0])) == 0)
			fprintf(fo, "DA\n");
		else
			fprintf(fo, "NU\n");
	}
	fclose(fo);
	fclose(fi);

	return 0;
}