Cod sursa(job #1994542)

Utilizator moonlightVartic Petru-Alexandru moonlight Data 25 iunie 2017 12:20:47
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#include <cstring>
#define dim 100005
#define INF 0x3f3f3f3f
using namespace std;
vector<pair <int,int> >G[dim];
int n,m,x,y,c,a,t,start_node,dist[dim];

void read();
int dijkstra(int nod);

int main()
{
    read();
    return 0;
}


void read(){

    fstream fin("distante.in",ios::in);
    fstream fout("distante.out",ios::out);
    fin >> t;
    for(int i=1;i<=t;++i){

        fin >> n >> m >> start_node;

        for(int j=1;j<=n;++j)
            fin >> dist[j];

        for(int j=1;j<=m;++j){
            fin >> x >> y >> c;
            G[x].push_back(make_pair(y,c));
        }
            if(dist[start_node] != 0)
                fout << "NU\n";
            else if(dijkstra(start_node) == 0)
                fout << "NU\n";
            else fout << "DA\n";

        for(int j=1;j<=n;++j)
            G[j].erase(G[j].begin(),G[j].end());
    }
    fin.close();
    fout.close();
}


int dijkstra(int nod){

    int cont = 1;
    set<pair <int,int> >Set;
    Set.insert(make_pair(0,nod));

    while(!Set.empty()){

        int node = Set.begin()->second;
        int distance = Set.begin()->first;
        Set.erase(Set.begin());

        for(vector<pair<int,int> >::iterator it = G[node].begin(); it != G[node].end();++it){
            int y = it->first;
            int c = it->second;

            if(dist[y] > dist[node] + c)
                return 0;
            if(dist[y] == dist[node] + c)
                cont++;
        }
    }
    return cont == n-1;
}