Cod sursa(job #2175372)

Utilizator andrei13Paval Andrei andrei13 Data 16 martie 2018 16:55:20
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <list>
#define INF 1<<30
using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int t;
int n,s,m;
list <int> adj[50500],cost[50500];
int bronz[50500];
bool viz[50500];
int dist[50500];

bool dijkstra(int source)
{
    for(int i=1;i<=n;++i)
        viz[i]=0,dist[i]=INF;
    dist[source]=0;
    for(int i=1;i<n;++i)
    {
        int mn=0;
        dist[0]=INF;
        for(int j=1;j<=n;++j)
            if(!viz[j] and dist[j]<dist[mn])
            mn=j;
        viz[mn]=1;
        list <int> :: iterator it,jt;
        for(it=adj[mn].begin(),jt=cost[mn].begin();it!=adj[mn].end();++it,++jt)
        {
            int u=*it;
            int cat=*jt;
            if(dist[u]>dist[mn]+cat)
                dist[u]=dist[mn]+cat;
        }
    }
    for(int i=1;i<=n;++i)
       if(dist[i]!=bronz[i])
          return false;
    return true;
}
int main()
{
    f>>t;
    for(int i=1;i<=t;++i)
    {
        f>>n>>m>>s;
        for(int j=1;j<=n;++j)
            f>>bronz[j];
        int a,b,c;
        for(int j=1;j<=m;++j)
        {
            f>>a>>b>>c;
            adj[a].push_back(b);
            cost[a].push_back(c);
            adj[b].push_back(a);
            cost[b].push_back(c);
        }
        if(dijkstra(s))
            g<<"DA"<<endl;
        else
            g<<"NU"<<endl;
    }

    return 0;
}