Cod sursa(job #1482922)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 8 septembrie 2015 12:35:23
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <cstring>
using namespace std;

const int MAXN = 30005;

int viz[MAXN], sum[MAXN], deg[MAXN], *graf[MAXN], *pond[MAXN];
int n, m, x,y;
void read()
{
    freopen("sate.in", "r", stdin);
    scanf("%d %d %d %d", &n, &m, &x, &y);
    for(; m > 0; --m){
        int i, j;
        scanf("%d %d", &i, &j);
        ++deg[i];
        ++deg[j];
    }
    for(int i = 1; i <= n; ++i){
        graf[i] = (int*) malloc(deg[i]*sizeof(int));
        pond[i] = (int*) malloc(deg[i]*sizeof(int));
    }
    fseek(stdin,0, SEEK_SET);
    memset(deg,0,(n+1)*sizeof(int));
    scanf("%d %d %d %d", &n, &m, &x, &y);
    for(int i = 0; i < m; ++i){
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        graf[a][deg[a]] = b;
        graf[b][deg[b]] = a;
        pond[a][deg[a]++] = c;
        pond[b][deg[b]++] = c;
    }
}
void release(){
    for(int i = 1; i <= n; ++i)
    {
        free(graf[i]);
        free(pond[i]);
    }
}
void bf(int rad)
{
    queue <int> coada;
    coada.push(rad);
    viz[rad] = 1;
    int capat2 = 0;
    while(!coada.empty())
    {
    rad = coada.front();
    coada.pop();
    int dim = deg[rad];
    for(int i = 0; i < dim; ++i)
    {
        capat2 = graf[rad][i];
        if(!viz[capat2])
        {
            coada.push(capat2);
            viz[capat2] = 1;
            if(rad < capat2)
                sum[capat2] = sum[rad] + pond[rad][i];
            else
                sum[capat2] = sum[rad] - pond[rad][i];
            if (capat2 == y)
                return ;
        }
    }
    }
}
int main()
{
    freopen("sate.out", "w", stdout);
    read();
    bf(x);
    printf("%d", sum[y]);
    release();
    return 0;
}