Cod sursa(job #359267)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 26 octombrie 2009 14:40:43
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

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

#define N 30010
#define MAX 30

int m, d;
short x, y, n;

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

void read()
{
    int i, j;
	short a[3], nr;
	char s[MAX];
	
    freopen(FIN, "r", stdin);

    scanf("%hd%d", &n, &m);
    scanf("%hd%hd\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] - '0' >= 0 && s[j] - '0' <= 9 || s[j] == ' '; ++ 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]));
        p[a[1]].push_back(v[a[0]].size() - 1);

        v[a[1]].push_back(make_pair(a[0], a[2]));
        p[a[0]].push_back(v[a[1]].size() - 1);
		
		scanf("\n");
    }
}

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

void DFS(int a, int d1)
{
    int i, d2, k;

    if (a == y)
        d = d1;

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

            k = v[a][i].first;
            v[a][i].first = 0;
            v[k][p[a][i]].first = 0;

            DFS(k, d2);
        }

    return;
}

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

    read();

    DFS(x, 0);

    printf("%hd\n", d);
}