Cod sursa(job #166795)

Utilizator scvalexAlexandru Scvortov scvalex Data 28 martie 2008 14:57:38
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> edge;

#define INF 1<<30

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

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

void dijkstra() {
	for (int i(1); i <= N; ++i)
		d[i] = INF;

	sq = eq = 0;
	q[eq++] = S;
	inq[S] = true;
	d[S] = 0;
	
	while (sq != eq) {
		int u = q[sq];
		//cout << "Sunt la " << u << endl;

		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;
				//cout << d[u] << " " << it->second << endl;
				//cout << "Distanta pana la " << it->first << " este " << d[it->first] << endl;
				if (!inq[it->first]) {
					q[eq] = it->first;
					inq[it->first] = true;
					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));
			//cout << u << " " << v << " " << w << ": " << G[u].size() << " " << G[u].size() << endl;
		}

		/*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();

		/*for (int i(1); i <= N; ++i)
			cout << d[i] << " ";
		cout << endl;*/

		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;
}