Cod sursa(job #1914453)

Utilizator nicu_serteSerte Nicu nicu_serte Data 8 martie 2017 17:02:23
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <vector>
#include <set>
#include <climits>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define inf (INT_MAX-10)
int n, s, dst[50001], d[50001];
vector <pair<int, int> > g[50001];
void citireGraf()
{
    int m, i, j, c;
    fin>>m>>s;
    for(i=1; i<=n; i++)
        fin>>dst[i];
    while(m)
    {
        m--;
        fin>>i>>j>>c;
        g[i].push_back(make_pair(j, c));
        g[j].push_back(make_pair(i, c));
    }
}
void dijkstra()
{
    multiset <pair<int, int> > heap;
    vector <pair<int, int> > :: iterator it;
    int k;
    for(k=1; k<=n; k++)
        d[k]=inf;
    d[s]=0;
    heap.insert(make_pair(0, s));
    while(!heap.empty())
    {
        k=heap.begin()->second;
        heap.erase(heap.begin());
        for(it=g[k].begin(); it!=g[k].end(); it++)
            if(d[it->first]>d[k]+it->second)
            {
                if(d[it->first]!=inf)
                    heap.erase(heap.find(make_pair(d[it->first], it->first)));
                d[it->first]=d[k]+it->second;
                heap.insert(make_pair(d[it->first], it->first));
            }
    }
}
void verif()
{
    for(int i=1; i<=n; i++)
        if(dst[i]!=d[i])
        {
            fout<<"NU\n";
            return;
        }
    fout<<"DA\n";
}
int main()
{
    int t, i, j;
    fin>>t;
    for(i=1; i<=t; i++)
    {
        fin>>n;
        if(i>1)
            for(j=1; j<=n; j++)
                g[j].clear();
        citireGraf();
        dijkstra();
        verif();
    }
    return 0;
}