Cod sursa(job #1076998)

Utilizator IoannaPandele Ioana Ioanna Data 10 ianuarie 2014 19:56:12
Problema Sate Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.09 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define NMAX 30002
using namespace std;

int n, m;
int x, y;
int dist[NMAX];
int q[NMAX];
vector<int> v[NMAX];
vector<int> c[NMAX];
char viz[NMAX];



void read() {
    char s[40];

    gets(s);
    int lim = strlen(s);
    int k = 0;
    while(s[k] >= '0' && s[k] <= '9') {
        n = n * 10 + s[k] - '0';
        k++;
    }

    k++;

     while(s[k] >= '0' && s[k] <= '9') {
        m = m * 10 + s[k] - '0';
        k++;
    }

    k++;

     while(s[k] >= '0' && s[k] <= '9') {
        x = x * 10 + s[k] - '0';
        k++;
    }

    k++;

     while(s[k] >= '0' && s[k] <= '9' && k < lim) {
        y = y * 10 + s[k] - '0';
        k++;
    }

   // scanf("%d%d%d%d", &n, &m, &x, &y);
    int a[3];
    int h = 0;
    if (x > y) swap(x, y);

    for (int i = 1; i <= m; i++) {
        //scanf("%d%d%d",&a, &b, &cost);
        gets(s);
        h = 0;
        a[0] = a[1] = a[2] = 0;

        lim = strlen(s);
        for (int k = 0; k < lim; k++) {
            if (s[k] >= '0' && s[k] <= '9') {
                a[h] = a[h] * 10 + s[k] - '0';
            }
            else h++;
        }

        v[a[0]].push_back(a[1]);
        c[a[0]].push_back(a[2]);
        v[a[1]].push_back(a[0]);
        c[a[1]].push_back(a[2]);
    }
}

void bfs() {
    q[0] = x;
    viz[x] = 1;
    int sat, lim, vecin;
    int st = 0;
    int dr = 0;
    while (st <= dr && !viz[y]) {
        sat = q[st];
        lim =  v[sat].size();
        for (int i = 0; i < lim; i++) {
            vecin = v[sat][i];
            if (!viz[vecin]) {
                viz[vecin] = 1;
                q[++dr] = vecin;
                if (vecin > sat) {
                    dist[vecin] = dist[sat] + c[sat][i];
                } else {
                    dist[vecin] = dist[sat] - c[sat][i];
                }
            }
        }
        st++;
    }
}

int main() {
    freopen("sate.in","r", stdin);
    freopen("sate.out", "w", stdout);
    read();
    bfs();
    printf("%d", dist[y]);
    return 0;
}