Cod sursa(job #2849455)

Utilizator TomKodeColev Thomas-Daniel TomKode Data 15 februarie 2022 10:34:41
Problema Distante Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define NMAX 30005
const int INF = 10005;
int n , m , s;
short c[NMAX][NMAX] ;
int pre[NMAX] , d[NMAX] ;
bool M[NMAX];
void dijkstra(int start)
{

    for(int i = 1  ; i <= n ; i ++)
    M[i] = 0;
        M[start] = 1;
    for(int i = 1 ; i <= n ; i ++)
    {
    d[i] = c[start][i];
        if(i != start)
            pre[i] = start;
        else
            pre[i] = 0;
    }
    for(int i = 1 ; i < n ; i ++)
    {
        int dmin = INF , vfmin;
        for(int j = 1 ; j <= n ; j ++)
        {
                if(!M[j] && d[j] < dmin)
                {
                    dmin = d[j];
                    vfmin = j;
                }
        }
        M[vfmin] = 1;
        for(int j = 1  ;j <= n ; j ++)
        {
            if(!M[j] && d[j] > d[vfmin] + c[vfmin][j])
                {d[j] = dmin + c[vfmin][j];
                pre[j] = vfmin;
                }
        }
    }
}
int main()
{
    int t , dist[NMAX];
    fin>>t;
    while(t--)
    {
        fin>>n>>m>>s;
        for(int i = 1  ;i <= n ; i ++)
            fin>>dist[i];
        for(int i = 1  ; i <= n ; i ++)
        for(int j = i+1 ; j <= n ; j ++)
            c[i][j] = c[j][i] = INF;
        for(int i = 1  ;i <= m ; i ++)
        {
        int a,b,cost;
        fin>>a>>b>>cost;
        c[a][b] = c[b][a] = cost;
        }

        bool ok = true;
        dijkstra(s);
        for(int i = 1  ; i <= n ; i ++)
        {
            if(d[i] != dist[i])
            {
                ok = false;
                break;
            }
        }
        if(ok)
            fout<<"DA\n";
        else
            fout<<"NU\n";
    }
}