Cod sursa(job #294545)

Utilizator scvalexAlexandru Scvortov scvalex Data 2 aprilie 2009 17:03:04
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

#define pb push_back
#define tr(c, i) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)

typedef pair<int, int> pii;

int N;
vector< vector<pii> > G;

int main(int argc, char *argv[]) {
	int N, M, X, Y, u, v, w;
	FILE *fi = fopen("sate.in", "r");
	fscanf(fi, "%d %d %d %d", &N, &M, &X, &Y);
	G.resize(N+1);
	while (M--) {
		fscanf(fi, "%d %d %d", &u, &v, &w);
		G[u].pb(pii(v, w));
		G[v].pb(pii(u, w));
	}
	fclose(fi);

	vector<int> D(N+1, -1);
	queue<int> Q;
	Q.push(X);
	D[X] = 0;

	while (!Q.empty()) {
		u = Q.front();
		Q.pop();

		tr(G[u], vv) {
			v = vv->first;
			w = vv->second;
			if (D[v] == -1) {
				if (v < u)
					D[v] = D[u] - w;
				else
					D[v] = D[u] + w;
				Q.push(v);
				if (v == Y)
					goto done;
			}
		}
	}

done:
	FILE *fo = fopen("sate.out", "w");
	fprintf(fo, "%d\n", D[Y]);
	fclose(fo);

	return 0;
}