Cod sursa(job #2655595)

Utilizator razvan1403razvan razvan1403 Data 4 octombrie 2020 21:37:39
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define l long
#define d double
#define in int
#define fo(i, n) for (i = 0; i < n; i++)
#define si(x) scanf('%d', &x)
#define sl(x) scanf('%lld', &x)
#define ss(s) scanf('%s', s) 
#define pi(x) printf('%d', x)
#define pl(x) printf('%lld', x)
#define ps(s) printf('%s', s) 
#define pb push_back 
#define mp make_pair 
#define F first 
#define S second 
#define all(x) x.begin(), x.end() 
#define clr(x) memset(x, 0, sizeof(x))
#define sortall(x) sort(all(x)) 
typedef pair<int, int> pii; 
typedef pair<ll, ll> pl; 
typedef vector<int> vi; 
typedef vector<ll> vl; 
typedef vector<pii> vpii;
#define INF 1000000000
#define NMAX 200001
string file = "distante";
//ifstream fin("citire.in");
ifstream fin(file+".in");
ofstream fout(file+".out");

vector<pair<int,int>> graf[NMAX];
vector<int>drum;

int n,m,s;

void dijkstra(int start_node)
{
    int distance[NMAX],i,j;
    int visited[NMAX];
    for(i=1;i<=n;i++)
    {
        visited[i] = 0;
        distance[i] = INF;
    }
    vector<pair<int,int>> ::iterator it;
    for(it = graf[start_node].begin(); it != graf[start_node].end(); ++it)
    {
        distance[it->first] = it->second;
    }
    visited[start_node] = 1;
    distance[start_node] = 0;
    int min,pmin = 0;
    for(i=1;i<=n-1;i++)
    {
        min = INF;
        for(j=1;j<=n;j++)
        {
            if(distance[j] < min && !visited[j])
            {
                min = distance[j];
                pmin = j;
            }
            visited[pmin] = 1;
            for(it  = graf[pmin].begin(); it != graf[pmin].end(); ++it)
            {
                if(distance[it->first] > distance[pmin] + it->second)
                {
                    distance[it->first] = distance[pmin] + it->second;
                }
            }
        }
    }
    bool ok = true;
    for(i=1;i<=n && ok == true;i++)
    {
        if(distance[i] != drum[i])
            ok = false;
    }
    if(ok == true)
    {
        fout<<"DA";
    }
    else fout<<"NU";
    fout<<'\n';
}

void solve()
{
    fin>>n>>m>>s;
    int i,x,y,c;
    
    for(i=1;i<=n;i++)
    {
        drum.push_back(0);
    }
    for(i=1;i<=n;i++)
    {
        fin>>x;
        drum[i] = x;
    }

    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        graf[x].push_back(make_pair(y,c));
        graf[y].push_back(make_pair(x,c));
    }
    dijkstra(s);
}

int main()
{
    unsigned T;
    fin>>T;
    while(T)
    {
        solve();
        T--;
    }
    fin.close();
    fout.close();
    return 0;
}