Cod sursa(job #1854558)

Utilizator Cudrici_CarinaCudrici Carina Cudrici_Carina Data 22 ianuarie 2017 20:50:54
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");

struct Pair
{
    int node,dist;
    bool operator < (const Pair& p) const
    {
        return dist>p.dist;
    }
};

void ReadGraph();
void Dijkstra(int S,vector<int> & d);
bool Rezultat(vector<int> & d1,vector <int> & d2);

vector<vector<Pair>> G;
vector<int> d1;
vector<int> d2;
const int Inf=0x3f3f3f3f;
int n,m,s,T;

int main()
{
fi>>T;
while(T--)
    {
    ReadGraph();
    Dijkstra(s,d2);
    if (Rezultat(d1,d2)) fo<<"DA"<<'\n';
                    else fo<<"NU"<<'\n';
    }
    return 0;
}
void ReadGraph()
{
    int x,y,w;
    fi>>n>>m>>s;
    G = vector<vector<Pair>>(n + 1,vector<Pair>(0));

    d1=vector<int>(n+1,0);
    d2=vector<int>(n+1,0);
    for(int i=1; i<=n; i++) fi>>d1[i];
    for(int i=1; i<=m; i++)
    {
        fi>>x>>y>>w;
        G[x].push_back({y,w});
        G[y].push_back({x,w});
    }
}

void Dijkstra(int x, vector<int> & d)
{
    priority_queue<Pair> Q;
    d = vector<int>(n+1,Inf);

    d[x]=0;

    for(Q.push({x,0}); !Q.empty() ; Q.pop())
    {
        x = Q.top().node;
        int dx = Q.top().dist;
        if (dx > d[x]) continue;
        for( auto & p : G[x] )
        {
            int y = p.node;
            int w=p.dist;
            if(d[y]> d[x]+w)
            {
                d[y]=d[x]+w;
                Q.push({y,d[y]});
            }
        }
    }
}
bool Rezultat(vector<int> & d1,vector <int> & d2)
{
    for(int i=1; i<=n; i++)
        if(d1[i] != d2[i]) return 0;
    return 1;
}