Cod sursa(job #2102781)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 9 ianuarie 2018 14:49:57
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;
vector <int> AD[50001],COST[50001];
int v[50001],viz[50001],dmin[50001];
int G()
{
    int nr=0;
    char c;
    while(!isdigit(c))
        c=getchar();
    while(isdigit(c))
    {
        nr=nr*10+c-'0';
        c=getchar();
    }
    return nr;
}
void dfs(int x)
{
//    int ;
    viz[x]=1;
    for(int i=0; i<AD[x].size(); i++)
        if(!viz[AD[x][i]])
        {
            dmin[AD[x][i]]=dmin[x]+COST[x][i];
            dfs(AD[x][i]);
        }
        else
            if(dmin[AD[x][i]]>dmin[x]+COST[x][i])
            {
                dmin[AD[x][i]]=dmin[x]+COST[x][i];
                dfs(AD[x][i]);
            }
}
int main()
{
    int t,ct,n,m,s,i,a,b,c;
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    t=G();
    for(ct=0; ct<t; ct++)
    {
        n=G();
        m=G();
        s=G();
        for(i=1; i<=n; i++)
            v[i]=G();
        for(i=0; i<m; i++)
        {
            a=G();
            b=G();
            c=G();
            AD[a].push_back(b);
            COST[a].push_back(c);
            AD[b].push_back(a);
            COST[b].push_back(c);
        }
        dfs(s);
        for(i=1; i<=n && v[i]==dmin[i]; i++);
        if(i>n) printf("DA\n");
        else printf("NU\n");
        memset(v+1,0,n);
        memset(viz+1,0,n);
        memset(dmin+1,0,n);
        for(i=1; i<=n; i++)
        {
            AD[i].clear();
            COST[i].clear();
        }
    }

    return 0;
}