Cod sursa(job #2829795)

Utilizator StefaniaCriStefania Cristea StefaniaCri Data 8 ianuarie 2022 23:07:28
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define inf   1000000000
int n,m,x,y;
#define Nmax 50007

vector< pair<int,int> > node_with_cost[Nmax];
vector<int> dijkstra(int source)
{
    vector<int> dist(n+1,inf);
    vector<bool> visited(n+1,false);
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater< pair<int,int> > > pq;

    dist[source]=0;

    pq.push(make_pair(0,source));
    while(!pq.empty())
    {
        int u=pq.top().second;
        pq.pop();
        if(visited[u]) continue;
        visited[u]=true;
        for(auto i=node_with_cost[u].begin();
            i!=node_with_cost[u].end();++i)
        {
            int v=(*i).first;
            int weight = (*i).second;
            if(dist[v]>dist[u]+weight)
            {
                dist[v]=dist[u]+weight;
                pq.push(make_pair(dist[v],v));
            }
        }
    }
  return dist;
}

int main()
{
    //problema distante-infoarena
    //idee: pentru calcularea distantelor folosim dijsktra
    //facem asta pentru ca datele sunt pozitive
    int numar_graf,cost;
    int bronzarel[Nmax];
    f>>numar_graf;

    int source;
    for(int i=1;i<=numar_graf;i++)
    {
        f>>n>>m>>source;

        for(int i=1;i<=n;i++)
        {
            f>>bronzarel[i];
            node_with_cost[i].clear();
        }

        for(int i=0;i<m;i++)
        {
            f>>x>>y>>cost;
            node_with_cost[x].push_back(make_pair(y,cost));
            node_with_cost[y].push_back(make_pair(x,cost));

        }

        vector<int> bumbarel = dijkstra(source);

        int ok=1;
        for(int i=1;i<=n;i++)
            if(bumbarel[i]!=bronzarel[i])
            {
                ok=0;
                g<<"NU\n";
                break;
            }
            if(ok)
                g<<"DA"<<"\n";
            }

    g.close();
    return 0;
}