Cod sursa(job #2113529)

Utilizator pionierul22aNa LiZa pionierul22 Data 24 ianuarie 2018 18:40:41
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct Nod
{
    int nod, cost;
};

vector <Nod> l[100001];

int n,m,s1,t1,d1[100001],d[100001],s[100001],t[100001];

void dijkstra(int r)
{
    int i;
    for(i=1;i<=n;i++)
        d[i]=999;

    vector <Nod> :: iterator it=l[r].begin();

    while(it!=l[r].end())
    {
        d[(*it).nod]=(*it).cost;
        t[(*it).nod]=r;
        it++;
    }
    d[r]=0;
    t[r]=0;
    for(i=1;i<=n;i++)
        s[i]=0;
    s[r]=1;
    int i0;
    for(int k=2;k<=n;k++)
    {
        int Min=9999;
        for(i=1;i<=n;i++)
            if(s[i]==0 && Min>=d[i])
        {
            Min=d[i];
            i0=i;
        }

        s[i0]=1;
        vector <Nod> :: iterator jt=l[i0].begin();

        while(jt!=l[i0].end())
        {
            if(d[(*jt).nod]>Min+(*jt).cost)
            {
                d[(*jt).nod]=Min+(*jt).cost;
                t[(*jt).nod]=i0;
            }
            jt++;
        }
    }

}

int verif()
{
    for (int i = 1; i <= n; i++)
        if (d[i] != d1[i])
            return 0;
    return 1;
}


int main()
{
    fin>>t1;
    while(t1)
    {
        t1--;
        fin>>n>>m>>s1;
        int i,j;
        for(i=1;i<=n;i++)
            fin>>d1[i];

        for(i=1;i<=n;i++)
        {
        vector <Nod> :: iterator it=l[i].begin();
        vector <Nod> :: iterator jt=l[i].end();
        l[i].erase(it,jt);
        }
        for(i=1;i<=m;i++)
        {
            int a,b,c;
            fin>>a>>b>>c;
            Nod x;
            x.cost=c;
            x.nod=b;
            l[a].push_back(x);
            x.nod=a;
            l[b].push_back(x);
        }

        dijkstra(s1);

        if(verif()==0)
            fout<<"NU\n";
        else
            fout<<"DA\n";

    }

    return 0;
}