Cod sursa(job #461726)

Utilizator S7012MYPetru Trimbitas S7012MY Data 8 iunie 2010 14:00:07
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
#define DN 50001
#define INFI 0x3f3f3f3f

int viz[DN],dist[DN],n,m,cdist[DN];
deque <int> coada;

struct nod {
    int x,cost;
    nod *urm;
}*v[DN];

void adaugare (int x, int y, int cost) {
    nod *p;
    p=new nod;
    p->x=y;
    p->cost=cost;
    p->urm=v[x];
    v[x]=p;
}

bool verifica(int sursa) {
    int i,ver[DN];
    nod *p;
    memset(ver,0,sizeof(ver));
    for(i=1; i<=n; i++)
        for(p=v[i];p!=NULL; p=p->urm) if(cdist[i]==cdist[p->x]+p->cost) ver[i]=1;
    for(i=1; i<=n; i++)
        if(!ver[i] && i!=sursa) return false;
    return true;
}

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    int i,j,t,sursa,x,y,c;
    scanf("%d",&t);
    for(i=1; i<=t; i++) {
        scanf("%d %d %d",&n ,&m,&sursa);
        for(j=1; j<=n; j++) scanf("%d",&cdist[j]);
        for(j=1; j<=m; j++) {
            scanf("%d %d %d",&x ,&y,&c );
            adaugare(x,y,c);
            adaugare(y,x,c);
        }
        if(verifica(sursa)) printf("DA\n");
        else printf("NU\n");
    }
    return 0;
}