Cod sursa(job #1422933)

Utilizator Liviu98Dinca Liviu Liviu98 Data 20 aprilie 2015 12:51:51
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <bits/stdc++.h>
#define NMax 50005
#define INFINIT 999999999
using namespace std;
int D[NMax],d[NMax],N,M,T,S,x,y,z;
vector< pair<int,int> > Graf[NMax];

class Compara
    {
    public:
        bool operator()(const int &a,const int &b)
        {
            return D[a]>D[b];
        }
    };
priority_queue<int,vector<int>,Compara> Q;

void Curata()
{
    for(int i=1;i<=Graf[i].size();i++)
    {
        Graf[i].clear();
    }
}

void Dijkstra(int k)
{
    for(int i=1; i<=N; i++)
        d[i]=INFINIT;

    d[k]=0;
    Q.push(k);

    while(!Q.empty())
    {
        int x=Q.top();
        Q.pop();
        for(int i=0; i<Graf[x].size(); ++i)
        {
            pair <int, int> p=Graf[x][i];
            if(d[p.first]> d[x]+p.second)
            {
                d[p.first] = d[x]+p.second;
                Q.push(p.first);
            }
        }
    }
}

void Afisare()
{
    //freopen("distante.out","w",stdout);
    ofstream f("distante.out");
    int OK=1;
    for(int i=1;i<=N;i++)
        if(D[i]!=d[i])
        OK=0;

    if(OK==1)
        {
            f<<"DA\n";
            return;
        }
    else
        f<<"NU\n";
}

void Citire()
{
   // freopen("distante.in","r",stdin);
    //scanf("%d",&T);
    ifstream g("distante.in");
    g>>T;
    for(int iterator=1;iterator<=T;iterator++)
    {
      //  scanf("%d%d%d",&N,&M,&S);
        g>>N>>M>>S;
        Curata();
        for(int k=1;k<=N;k++)
        //    scanf("%d",&D[k]);
        g>>D[k];
        for(int k=1;k<=M;k++)
        {
          //  scanf("%d%d%d",&x,&y,&z);
          g>>x>>y>>z;
            Graf[x].push_back(make_pair(y,z));
            Graf[y].push_back(make_pair(x,z));
        }
        Dijkstra(S);
        Afisare();
    }
}

int main()
{
    Citire();
}