Cod sursa(job #1081648)

Utilizator piroslPiros Lucian pirosl Data 13 ianuarie 2014 19:56:52
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<fstream>
#include<vector>
using namespace std;

#define maxn 30002

int d[maxn];
int stack[maxn];
int colour[maxn];
vector<int> adj[maxn];
vector<int> disAdj[maxn];

int main(void) {
	ifstream in;
	ofstream out;

	in.open("sate.in");
	out.open("sate.out");

	int n, m, x, y;

	in >> n >> m >> x >> y;

	for(int i=0;i<=n;++i) {
		d[i] = -1;
		colour[i] = 0;
	}

	for(int i=0;i<m;++i) {
		int s,e,dist;
		in >> s >> e >> dist;

		adj[s].push_back(e);
		disAdj[s].push_back(dist);

		adj[e].push_back(s);
		disAdj[e].push_back(dist);
	}

	int stackHead = 0;
	int stackTail = 0;

	stack[stackTail++] = x;
	d[x] = 0;
	colour[x] = 1;

	while(stackHead < stackTail) {
		int curent = stack[stackHead++];
		if(curent == y)
			break;
		for(unsigned int i=0;i<adj[curent].size();++i) {
			if(colour[adj[curent][i]] == 0) {
				stack[stackTail++] = adj[curent][i];
				colour[adj[curent][i]] = 1;
				if(curent < adj[curent][i]) {
					d[adj[curent][i]] = d[curent] + disAdj[curent][i];
				}
				else {
					d[adj[curent][i]] = d[curent] - disAdj[curent][i];
				}
			}
		}
		colour[curent] = 2;
	}

	if(d[y] < 0)
		d[y] *= -1;

	out << d[y] << "\n";

	out.close();
	in.close();

	return 0;
}