Cod sursa(job #67610)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 25 iunie 2007 12:35:09
Problema Sate Scor 80
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 9-a si gimnaziu Marime 1.08 kb
#include <stdio.h>
#include <vector>

using namespace std;

const int N_MAX = 30010;

vector <pair<int, int> > G[N_MAX];

int Y, is[N_MAX];

int dist, fin;

void find(int sat)
{
	is[sat] = 1;
	if (sat == Y) {
		fin = dist;
	}
	
	vector <pair<int, int> >::iterator it;

	for (it = G[sat].begin(); it != G[sat].end(); ++ it) {
		if (!is[it -> first]) {
			if (it -> first < sat) {
				dist -= it -> second;
			} else {
				dist += it -> second;
			}
			find(it -> first);

			if (it -> first < sat) {
				dist += it -> second;
			} else {
				dist -= it -> second;
			}
		}
	}
}

int main()
{
	freopen("sate.in", "r", stdin);
#ifndef _SCREEN_
	freopen("sate.out", "w", stdout);
#endif

	int N, M, X, i, x, y, c;
	int mn, mx;

	scanf("%d %d %d %d\n", &N, &M, &X, &Y);

	int aux;
	if (X > Y) {
		aux = X;
		X = Y;
		Y = aux;
	}

	for (i = 1; i <= M; i ++) {

		scanf("%d %d %d\n", &x, &y, &c);
		if (x < y) {
			mn = x;
			mx = y;
		} else {
			mx = x;
			mn = y;
		}

		G[mn].push_back(make_pair(mx, c));
		G[mx].push_back(make_pair(mn, c));
	}

	dist = 0;
	find(X);

	printf("%d\n", fin);

	return 0;
}