Cod sursa(job #1733718)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 25 iulie 2016 14:49:42
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include<vector>
#include<deque>
#include<cstring>
#define inf 2147483647
using namespace std;
int T,n,m,s,ok;
int c[50003],dmin[50003];
vector<int>graf[50003],costuri[50003];
deque<int>St;
void dijkstra(int nod)
{
    int sz,x1,x2,cost;
    for(int i=1;i<=n;i++)
    dmin[i]=inf;
    dmin[nod]=0;
    St.push_back(nod);
    while(!St.empty())
    {
        x1=St.front();
        St.pop_front();
        sz=graf[x1].size();
        for(int i=0;i<sz;i++)
        {
            x2=graf[x1][i];
            cost=costuri[x1][i];
            if(dmin[x2]>dmin[x1]+cost)
            {
                dmin[x2]=dmin[x1]+cost;
                St.push_back(x2);
            }
        }
    }
}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&T);
    while(T)
    {
        T--;
        ok=1;
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=n;i++)
            scanf("%d",&c[i]);
        for(int i=1,x,y,d;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&d);
            graf[x].push_back(y);
            graf[y].push_back(x);
            costuri[x].push_back(d);
            costuri[y].push_back(d);
        }
        dijkstra(s);
        for(int i=1;i<=n&&ok==1;i++)
            if(c[i]!=dmin[i])
            {
                printf("NU\n");
                ok=0;
            }
        if(ok==1)
            printf("DA\n");
        memset(dmin,0,sizeof(dmin));
        for(int i=0;i<=50003;i++)
        {
            graf[i].clear();
            costuri[i].clear();
        }
    }
    return 0;
}