Cod sursa(job #2201926)

Utilizator PredaBossPreda Andrei PredaBoss Data 6 mai 2018 16:15:02
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define INF 1e9
#define pii pair<int,int>
using namespace std;
vector<pii>nod[50000];
vector<int>bronz;
int mn[50005];
deque<pii>dq;
int x,y,cost,n,m,s,val,t;
void solve()
{
    while(!dq.empty())
    {
        int cost=dq.front().second;
        int pos=dq.front().first;
        dq.pop_front();
        for(vector<pii>::iterator it=nod[pos].begin();it!=nod[pos].end();it++)
        {
            if(mn[it->first]<=cost+it->second)
                continue;
            mn[it->first]=cost+it->second;
            dq.push_back({it->first,mn[it->first]});
        }
    }
}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d\n",&t);
    for(int i=1;i<=t;i++)
    {
        for(int j=1;j<=n;j++)
            nod[j].resize(0);
        scanf("%d %d %d\n",&n,&m,&s);
        bronz.resize(0);
        for(int j=1;j<=n;j++)
            mn[j]=INF;
        mn[s]=0;
        for(int j=1;j<=n;j++)
        {
            scanf("%d ",&val);
            bronz.push_back(val);
        }
        scanf("\n");
        for(int j=1;j<=m;j++)
        {
            scanf("%d %d %d\n",&x,&y,&cost);
            nod[x].push_back({y,cost});
            nod[y].push_back({x,cost});
        }
        dq.push_back({s,0});
        solve();
        bool k=1;
        int j;
        for(j=1;j<=n;j++)
            if(mn[j]!=bronz[j-1])
            {
                k=0;
                break;
            }
        if(k)
            printf("DA\n");
        else
            printf("NU\n");
    }
    return 0;
}