Cod sursa(job #891264)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 25 februarie 2013 15:08:07
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
#define mp make_pair
#define dis first
#define node second
using namespace std;
priority_queue <pair<int,int> ,vector<pair<int,int> > ,greater<pair<int,int> > >q;
FILE*in=fopen("distante.in","r");
FILE*out=fopen("distante.out","w");
int dist[50001],v[50001];
vector<pair<int,int> >a[50001];
void dijkstra(int nod);
int noduri,muchii,start;
int main()
{
    int query;
    fscanf(in,"%d",&query);
    for(int ooo=1;ooo<=query;++ooo)
    {
        fscanf(in,"%d%d%d",&noduri,&muchii,&start);
        for(int i=1;i<=noduri;++i)
            {
                dist[i]=1061109567;
                fscanf(in,"%d",&v[i]);
            }
        for(int i=1;i<=muchii;++i)
        {
            int data1,data2,data3;
            fscanf(in,"%d%d%d",&data1,&data2,&data3);
            a[data1].push_back(mp(data3,data2));
            a[data2].push_back(mp(data3,data1));
        }
        dist[start]=0;
        dijkstra(start);
        bool OK=true;
        for(int i=1;i<=noduri;++i)
            if(v[i]!=dist[i])
            {
                OK=false;
                break;
            }
        if(OK)
            fprintf(out,"DA\n");
        else
            fprintf(out,"NU\n");
        for(int i=1;i<=noduri;++i)
            a[i].clear();
    }
fclose(in);
fclose(out);
return 0;
}
void dijkstra(int nod)
{
    q.push(mp(0,nod));
    while(!q.empty())
    {
        pair<int,int> curent=q.top();
        q.pop();
        for(int i=0;i<(int)a[curent.node].size();++i)
        {
            if(dist[a[curent.node][i].node]>dist[curent.node]+a[curent.node][i].dis)
            {
                dist[a[curent.node][i].node]=dist[curent.node]+a[curent.node][i].dis;
                q.push(mp(dist[a[curent.node][i].node],a[curent.node][i].node));
            }
        }
    }
}