Cod sursa(job #1428882)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 5 mai 2015 11:22:06
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream ka("distante.in");
ofstream ki("distante.out");

const int N_MAX = 50000;

bool vazut[N_MAX + 1];
int t, n, m, s, a, b, c, distanta[N_MAX + 1];

struct muchie
{
    int index, cost;
    bool operator < (const muchie arg) const
    {
        return cost > arg.cost;
    }
};

vector <muchie> graf[N_MAX + 1];
priority_queue <muchie> coada;

string dijkstra()
{
    muchie mm;
    mm.index = s;
    mm.cost = 0;
    coada.push(mm);
    vazut[s] = true;
    while(!coada.empty())
    {
        int t = coada.top().index;
        coada.pop();
        for(int i = 0; i < graf[t].size(); i++)
        {
            if(distanta[t] + graf[t][i].cost == distanta[graf[t][i].index] && !vazut[graf[t][i].index])
            {
                vazut[graf[t][i].index] = true;
                muchie mm;
                mm.index = graf[t][i].index;
                mm.cost = distanta[mm.index];
                coada.push(mm);
            }
        }
    }
    for(int i = 1; i <= n; i++)
        if(!vazut[i])
            return "NU";
    return "DA";
}

int main()
{
    ka >> t;
    for(int i = 1; i <= t; i++)
    {
        ka >> n >> m >> s;
        for(int j = 1; j <= n; j++)
        {
            ka >> distanta[j];
            vazut[j] = false;
            graf[j].clear();
        }
        for(int j = 1; j <= m; j++)
        {
            ka >> a >> b >> c;
            muchie mm;
            mm.index = b;
            mm.cost = c;
            graf[a].push_back(mm);
            mm.index = a;
            graf[b].push_back(mm);
        }
        ki << dijkstra() << '\n';
    }
}