Cod sursa(job #2452640)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 31 august 2019 16:19:53
Problema Grupuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

ifstream fin("catun.in");
ofstream fout("catun.out");

int n, m, k, f, sol[36004];
bool b[36003];

struct  name{
                int x, dist;
            };

struct name2{
                int x, dist, o;
            };

class Compare{
                public:
                    bool operator() (name2 x, name2 y)
                    {
                        return x.dist>y.dist||(x.dist==y.dist&&x.o>y.o);
                    }

             };

vector<name> g[36003];

priority_queue<name2, vector<name2>, Compare> q;

int main()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;++i)
    {
        int x;
        fin>>x;
        name2 var;
        var.x=x, var.dist=0, var.o=x;
        q.push(var);
        //cout<<var.x<<" "<<var.dist<<" "<<var.o<<"\n";
    }
    for(int i=1;i<=m;++i)
    {
        int x, y, z;
        fin>>x>>y>>z;
        name var;
        var.dist=z;
        var.x=y;
        g[x].push_back(var);
        var.x=x;
        g[y].push_back(var);
    }
    while(!q.empty())
    {
        while(!q.empty()&&b[q.top().x]) q.pop();
        if(q.empty()) break;
        name2 nod=q.top();
        //cout<<nod.x<<" "<<nod.dist<<" "<<nod.o<<"\n";
        q.pop();
        b[nod.x]=1;
        sol[nod.x]=nod.o;
        if(nod.x==nod.o) sol[nod.x]=0;
        for(int i=0;i<g[nod.x].size();++i)
        {
            name2 var;
            var.x=g[nod.x][i].x;
            var.dist=g[nod.x][i].dist+nod.dist;
            var.o=nod.o;
            //cout<<var.x<<" "<<var.dist<<" "<<var.o<<"\n";
            q.push(var);
        }
        //cout<<"\n";
    }
    for(int i=1;i<=n;++i) fout<<sol[i]<<" ";
    return 0;
}