Cod sursa(job #899947)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 28 februarie 2013 17:02:20
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
# include <vector>
# include <queue>
#define MAXINT 0x7FFFFFFF
using namespace std;

vector < pair <int, int> > v[50010];
int d[50010],i,j,a,b,c,n,m,s,d1[50010],t,p;
bool ok;
struct comp
{
    bool operator () (const int &x, const int &y)
    {
        return (d[x]>d[y]);
    }
};

priority_queue <int, vector <int>, comp> q;


void bellmanford(int nod, int d[])
{
    int i;
    for (i=0; i<=n; i++)
        d[i]=MAXINT;
    d[nod]=0;
    q.push(nod);
    while (!q.empty())
    {
       int  k=q.top();
        q.pop();
        for (i=0; i<v[k].size(); ++i)
        {
            int vecin=v[k][i].second;
            int cost=v[k][i].first;
            if (d[vecin]>d[k]+cost)
            {
                d[vecin]=d[k]+cost;
                q.push(vecin);
            }
        }
    }
}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d\n",&t);
    for (p=1; p<=t; p++)
    {
        scanf("%d %d %d\n",&n,&m,&s);
        for (i=1; i<=n; i++)
            v[i].clear();

        for (i=1; i<=n; i++)
             scanf("%d ",&d1[i]);
        for (i=1; i<=m; i++)
        {
            scanf("%d %d %d\n",&a,&b,&c);
            v[a].push_back(make_pair(c,b));
        }

        bellmanford(s,d);
        ok=true;
        for (i=1; i<=n; i++)
            if (d[i]!=d1[i])
            {
                printf("NU\n");
                ok=false;
                break;
            }
        if (ok==true)
            printf("DA\n");
    }
    return 0;
}