Cod sursa(job #1119186)

Utilizator ZanarokStefan Mocanu Zanarok Data 24 februarie 2014 16:00:14
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <set>
using namespace std;

#define INF 1000000000

vector < vector <int> > nod;
vector < vector <int> > cost;
set < pair <int,int> > T;
int i,n,m,s,d[50001],dc[50001];
void citeste()
{
    int a,b,c;
    for(int k=1;k<=m;k++)
    {
        scanf("%d %d %d",&a,&b,&c);
        nod[a].push_back(b);
        nod[b].push_back(a);
        cost[a].push_back(c);
        cost[b].push_back(c);
    }
}

int rezolva()
{
    T.insert(make_pair(0,s));
    d[s]=0;
    int a,b;
    while(T.size()>0)
    {
        a=(*T.begin()).first;
        b=(*T.begin()).second;
        T.erase(T.begin());
        if(d[b]!=dc[b])
            return 0;
        for(int k=0;k<nod[b].size();k++)
            if(d[nod[b][k]] > d[b] + cost[b][k])
            {
                d[nod[b][k]]=d[b]+cost[b][k];
                T.insert(make_pair(d[nod[b][k]],nod[b][k]));
            }
    }
    return 1;
}
/*
int corect()
{
    for(int k=1;k<=n;k++)
        cout<<d[k]<<" ";
    cout<<'\n';
    for(int k=1;k<=n;k++)
        cout<<dc[k]<<" ";
    for(int k=1;k<=n;k++)
        if(d[k]!=dc[k])
            return 0;
    return 1;
}*/
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&i);
    for(int q=1;q<=i;q++)
    {
        scanf("%d %d %d",&n,&m,&s);
        for(int k=1;k<=n;k++)
        {
            d[k]=INF;
            scanf("%d",&dc[k]);
        }
        nod.resize(n+1);
        cost.resize(n+1);
        citeste();
        if(rezolva())
            printf("DA\n");
        else
            printf("NU\n");
        nod.resize(0);
        cost.resize(0);
    }
    return 0;
}