Cod sursa(job #362252)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 8 noiembrie 2009 18:27:56
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;

#define FIN "sate.in"
#define FOUT "sate.out"

#define N 30001
#define MAX 30

int m, x, y, n;
int a[N];

vector < pair < int, int > > v[N];

queue <int> q;

void read()
{
    int i, a[3], j, nr;
	char s[MAX];

    freopen(FIN, "r", stdin);

    scanf("%d%d", &n, &m);
    scanf("%d%d\n", &a[0], &a[1]);

    x = min(a[0], a[1]);
    y = max(a[0], a[1]);

    for (i = 1, nr = 0; i <= m; ++ i)
    {
        gets(s);

		a[0] = a[1] = a[2] = 0;

        for (j = 0, nr = 0 ; s[j] && s[j] != 13; ++ j)
		{
			if (s[j] == ' ')
				++ nr;
			else
				a[nr] = a[nr] * 10 + (s[j] - '0');
		}

		v[a[0]].push_back(make_pair(a[1], a[2]));
        v[a[1]].push_back(make_pair(a[0], a[2]));

		scanf("\n");
    }
}

inline int mod(int a)
{
    return a > 0 ? a : -a;
}

void BFS()
{
    int i, k, s;

    q.push(x);

    while (!q.empty())
    {
        s = q.front();
        q.pop();

        if (s == y)
            break;

        for (i = 0; i < v[s].size(); ++ i)
            if (!a[v[s][i].first] && v[s][i].first != x)
            {
                if ((x <= s && s < v[s][i].first) || (x >= s && s > v[s][i].first))
                    a[v[s][i].first] = a[s] + v[s][i].second;
                else
                    a[v[s][i].first] = mod(a[s] - v[s][i].second);

                q.push(v[s][i].first);
            }
    }
}

int main()
{
    freopen(FOUT, "w", stdout);

    read();

    BFS();

    printf("%d\n", a[y]);
}