Cod sursa(job #1610790)

Utilizator DragodanAlexandraDragodan Alexandra DragodanAlexandra Data 23 februarie 2016 18:50:36
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream>
#include <iostream>
#include<vector>
#include<queue>
#define inf 9999999999
#define mp make_pair
#define pb push_back

using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector<vector<pair<int,int> > >a;
vector<int>d,dist;
priority_queue<pair<int,int> >q;
int n,m,s,t;
void dijkstra(int st)
{
    d[st]=0;
    q.push(mp(0,st)); // bag nodul in mult si dist pana la el
    while(!q.empty())
    {
        int x=q.top().second;
        q.pop();
        for(vector<pair<int,int> >::iterator it=a[x].begin();it!=a[x].end();it++)
        if(d[x]+it->second < d[it->first])
        {
            d[it->first]=d[x]+it->second;
            q.push(mp(-d[it->first],it->first));
        }
    }

}

void afisare()
{
    int i,ok=1;
    for(i=1;i<=n;i++) if(d[i]!=dist[i]) {ok=0;break;}
    if(ok==1) g<<"DA"<<"\n";
    else g<<"NU"<<"\n";
}

void citire()
{
    f>>t;
    for(int i=1;i<=t;i++)
    {
        f>>n>>m>>s;

        a=vector<vector<pair<int,int> > >(n+1);
        d=vector<int>(n+1,inf);
        dist=vector<int>(n+1);
        for(int k=1;k<=n;k++) f>>dist[k];
        for(int j=1;j<=m;j++)
        {
            int x,y,z;
            f>>x>>y>>z;
            a[x].pb(mp(y,z));
            a[y].pb(mp(x,z));

        }
        dijkstra(s);
        afisare();
    }
}
int main()
{
    citire();
    return 0;
}