Cod sursa(job #2668165)

Utilizator Edwuard99Diaconescu Vlad Edwuard99 Data 4 noiembrie 2020 16:25:03
Problema Sate Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <vector>
#define NMAX 30000
#define ps push_back
#define sz size()

#define Dim 5000000

#define cit(x)						\
{							\
	x = 0;						\
	while(buf[poz] < '0' || buf[poz] > '9')		\
		if(++poz == Dim)			\
			fread(buf,1,Dim,stdin);		\
	while(buf[poz] >= '0' && buf[poz] <= '9')	\
	{						\
		x = x*10 + buf[poz] - '0';		\
    		    if(++poz == Dim)			\
			fread(buf,1,Dim,stdin);		\
	}						\
}


int poz = 0;

char buf[Dim];

using namespace std;

vector<int> a[NMAX+3], d[NMAX+3];
int n, m;
int x, y;
int dist;
short int uz[NMAX+3];

void read()
{
    fread(buf,1,Dim,stdin);

    int i;
    int j, k, l;
    //scanf("%d %d %d %d", &n, &m, &x, &y);
    cit(n);
    cit(m);
    cit(x);
    cit(y);


    for(i = 0; i < m; ++i)
    {
        //scanf("%d %d %d", &j, &k, &l);
        cit(j);
        cit(k);
        cit(l);
        a[j].ps(k);
        d[j].ps(l);

        a[k].ps(j);
        d[k].ps(l);
    }

}

void df(int nod)
{
    if(nod == y)
    {
        printf("%d\n", dist);
        exit(0);
    }
    int i, aux = a[nod].sz;

    for(i = 0; i < aux; ++i)
    {
        if(uz[ a[nod][i] ])
            continue;

        uz[ a[nod][i] ] = 1;

        if(a[nod][i] < nod)
        {
            dist -= d[nod][i];

            df(a[nod][i]);

            dist += d[nod][i];
        }
        else
        {
            dist += d[nod][i];

            df(a[nod][i]);

            dist -= d[nod][i];
        }
    }
}

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

    read();

    if(x > y)
    {
        int aux = x;
        x = y;
        y = aux;
    }

    uz[x] = 1;
    df(x);

    return 0;
}