Cod sursa(job #1027261)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 12 noiembrie 2013 17:48:41
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

struct muchie {
    int nod,dist;
};

struct distnod {
    int nod,dist;
};

struct comp {
    bool operator()(distnod &a,distnod &b) {
        return a.dist > b.dist;
    }
};

vector <muchie> v[50005];
vector <muchie> :: iterator it;
priority_queue <distnod,vector<distnod>,comp> q;
int distc[50005];
int dist[50005];
bool viz[50005];
int teste,n,m,s;

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

distnod mkdistnod(int nod,int dist) {
    distnod nou;
    nou.dist = dist;
    nou.nod = nod;
    return nou;
}

bool verifica() {
    for (int i=1;i<=n;i++) if (dist[i] != distc[i]) return false;
    return true;
}

void dijkstra(int s) {
    q.push(mkdistnod(s,0));
    viz[s] = true;
    dist[s] = 0;
    while (!q.empty()) {
        distnod ct = q.top(); q.pop();
        viz[ct.nod] = true;
        for (it = v[ct.nod].begin();it != v[ct.nod].end();it++) {
            muchie muc = *it;
            if (viz[muc.nod]) continue;
            if (ct.dist + muc.dist < dist[muc.nod]) {
                dist[muc.nod] = ct.dist + muc.dist;
                q.push(mkdistnod(muc.nod,dist[muc.nod]));
            }
        }
    }
}

int main() {
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    scanf("%d",&teste);
    while (teste--) {
        scanf("%d %d %d",&n,&m,&s);
        for (int i=1;i<=n;i++) {
            dist[i] = 2000000000;
            viz[i] = false;
            scanf("%d",&distc[i]);
            while (!v[i].empty()) v[i].pop_back();
        }
        for (int i=1;i<=m;i++) {
            int a,b,d;
            scanf("%d %d %d",&a,&b,&d);
            if (a==b) continue;
            v[a].push_back(mkmuc(b,d));
            v[b].push_back(mkmuc(a,d));
        }
        dijkstra(s);
        if (verifica()) printf("DA\n");
        else printf("NU\n");
    }
    return 0;
}