Cod sursa(job #1081662)

Utilizator piroslPiros Lucian pirosl Data 13 ianuarie 2014 20:04:15
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<vector>
using namespace std;

#define maxn 30002

typedef struct muchie {int x; int d;};
muchie muc;

int d[maxn];
int stack[maxn];
int colour[maxn];
vector<muchie> adj[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;
		muc.x = e;
		muc.d = dist;
		adj[s].push_back(muc);

		muc.x = s;
		adj[e].push_back(muc);
	}

	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].x] == 0) {
				stack[stackTail++] = adj[curent][i].x;
				colour[adj[curent][i].x] = 1;
				if(curent < adj[curent][i].x) {
					d[adj[curent][i].x] = d[curent] + adj[curent][i].d;
				}
				else {
					d[adj[curent][i].x] = d[curent] - adj[curent][i].d;
				}
			}
		}
		colour[curent] = 2;
	}

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

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

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

	return 0;
}