Cod sursa(job #502332)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 18 noiembrie 2010 21:41:25
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<cstdio>
#include<queue>
#include<vector>
#include<fstream>
using namespace std;
const int N=1<<16;
int n,vec[N],lung[N];
bool proc[N];
priority_queue<pair<int,int> > H;
vector<pair<int,int> > L[N];
ifstream f("distante.in");
void read()
{
    int m,ni,x,y,c;
    f>>n>>m>>ni;
    H.push(make_pair(0,ni));
    for(int i=1;i<=n;i++)
        f>>vec[i];
    for(int i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        L[x].push_back(make_pair(c,y));
        L[y].push_back(make_pair(c,x));
    }
}
void dijkstra()
{
    while(!H.empty())
    {
        int cost,nod;
        cost=H.top().first;
        nod=H.top().second;
        H.pop();
        if(!proc[nod])
        {
            lung[nod]=cost;
            proc[nod]=true;
            for(vector<pair<int,int> >::iterator it=L[nod].begin();it!=L[nod].end();it++)
                if(!proc[it->second])
                    H.push(make_pair(cost-it->first,it->second));
        }
    }
}
bool verif()
{
    for(int i=1;i<=n;i++)
        if(-lung[i]!=vec[i])
            return false;
    return true;
}
void empty()
{
    for(int i=1;i<=n;i++)
    {
        while(!L[i].empty())
            L[i].pop_back();
        lung[i]=0;
        proc[i]=false;
    }
}
int main()
{
    freopen("distante.out","w",stdout);
    int t;
    f>>t;
    while(t--)
    {
        read();
        dijkstra();
        if(verif())
            printf("DA\n");
        else printf("NU\n");
        empty();
    }
    return 0;
}