Cod sursa(job #1826741)

Utilizator BovisioNitica Ionut Bogdan Bovisio Data 10 decembrie 2016 20:25:11
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>

using namespace std;

const int inf = 1000000000;
const int maxn = 50000;

int x;
int n,m,s;
int d1[maxn],d2[maxn];

int c[20000][20000],viz[maxn];

void Read()
{
    int t1,t2,co;
    scanf("%i %i %i",&n,&m,&s);
    for(int i=1;i<=n;i++)
    {
        scanf("%i",&d1[i]);
        viz[i] = d2[i] = 0;
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i == j)
                c[i][j] = 0;
            else
                c[i][j] = inf;
        }
    }

    for(int i=1;i<=m;i++)
    {
        scanf("%i %i %i",&t1,&t2,&co);
        c[t1][t2] = co;
    }
}

void Pasul1()
{
    for(int i=1;i<=n;i++)
    {
        d2[i] = c[s][i];
        if(i == s)
            viz[i] = 1;
        else
            viz[i] = 0;
    }
}

int minim()
{
    int loc = 0;
    int min = inf;
    for(int i=1;i<=n;i++)
    {
        if(viz[i] == 0 && d2[i] != inf)
        {
            if(d2[i] < min)
            {
                min = d2[i];
                loc = i;
            }
        }
    }
    return loc;
}

void Pasul2()
{
    int loc;
    for(int i=2;i<=n;i++)
    {
        loc = minim();
        viz[loc] = 1;
        for(int j=1;j<=n;j++)
        {
            if(d2[j] > d2[loc] + c[loc][j])
                d2[j] = d2[loc] + c[loc][j];
        }
    }
}

void Verificarea()
{
    int f=0;
    for(int i=1;i<=n;i++)
    {
        if(d1[i] != d2[i])
        {
            f=1;
        }
    }
    if(f==1)
        printf("Nu\n");
    else
        printf("Da\n");
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%i",&x);
    for(int i=1;i<=x;i++)
    {
        Read();
        Pasul1();
        Pasul2();
        Verificarea();
    }
    return 0;
}