Cod sursa(job #1028945)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 14 noiembrie 2013 21:00:15
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <vector>
using namespace std;

struct muchie {
    int nod,dist;
};
vector <muchie> v[50005];
int dist[50005];
bool gasit[50005];
bool maimic,rau;
int n,m,s,t;

inline muchie mkmuc(int nod,int dist) {
    muchie nou;
    nou.dist = dist;
    nou.nod = nod;
    return nou;
}

int main() {
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&t);
    while (t--) {
        maimic = rau = false;
        scanf("%d %d %d",&n,&m,&s);
        for (int i=1;i<=n;i++) {
            scanf("%d",&dist[i]);
            gasit[i] = false;
        }
        for (int i=1;i<=m;i++) {
            int a,b,d;
            scanf("%d %d %d",&a,&b,&d);
            v[a].push_back(mkmuc(b,d));
            v[b].push_back(mkmuc(a,d));
        }
        for (int i=1;i<=n;i++) while (!v[i].empty()) {
            muchie muc = v[i].back(); v[i].pop_back();
            if (dist[muc.nod] == dist[i] + muc.dist) gasit[muc.nod] = true;
            if (dist[muc.nod] > dist[i] + muc.dist) {maimic = true;break;}
        }
        if (dist[s] == 0) gasit[s] = true;
        if (maimic) {
            printf("NU\n");
            rau = true;
        }
        if (!rau) for (int i=1;i<=n;i++) if (!gasit[i]) {
            printf("NU\n");
            rau = true;
            break;
        }
        if (!rau) printf("DA\n");
    }
    return 0;
}