Cod sursa(job #1059641)

Utilizator sorin2kSorin Nutu sorin2k Data 16 decembrie 2013 20:47:55
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<fstream>
#include<utility>
#include<queue>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");

vector< pair<int, int> >adj[30000];
int dist[30000], viz[30000];
int n, m, i, start, end, u, v, c, current;
queue<int> q;

int main() {
	fin >> n >> m >> start >> end;
	start--; end--;
	for(i = 0; i < m; i++) {
		fin >> u >> v >> c;
		u--; v--;
		adj[u].push_back(make_pair(v, c));
		adj[v].push_back(make_pair(u, c));
	}
	// start BFS
	q.push(start);
	viz[start] = 1;
	while(!q.empty()) {
		current = q.front();
		q.pop();
		if(current == end) break;
	//	fout << current << endl;
		for(i = 0; i < (int)adj[current].size(); i++) {
			if(viz[adj[current][i].first] == 0) {
				viz[adj[current][i].first] = 1;
				q.push(adj[current][i].first);
				if(current > start) {
					if(adj[current][i].first > current) {
						dist[adj[current][i].first] = dist[current] + adj[current][i].second;
					} else {
						dist[adj[current][i].first] = abs(dist[current] - adj[current][i].second);
					}
				} else {
					if(adj[current][i].first < current) {
						dist[adj[current][i].first] = dist[current] + adj[current][i].second;
					} else {
						dist[adj[current][i].first] = abs(dist[current] - adj[current][i].second);
					}
				}
			}
		}
	}
	fout << dist[end];
	return 0;
}