Cod sursa(job #969903)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 5 iulie 2013 17:09:10
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <bitset>
#include <queue>
#include <list>

using namespace std;

ifstream cin("catun.in");
ofstream cout("catun.out");

#define val first
#define ind second
#define inf (1<<31-1)

struct elem
{
    int ind,val,parinte;
};

bool operator<(const elem &a,const elem &b)
{
    if(a.val>b.val)
        return 1;
    if(a.val==b.val)
        if(a.parinte>b.parinte)
            return 1;
    return 0;
}

list<pair<int,int> > v[56005];
bool viz[56005];
priority_queue<elem> coada;
int prec[56005];
int d[56005];

int main()
{
    int n,m,k,i,x;
    cin>>n>>m>>k;
    for(i=1;i<=n;i++)
    {
        d[i]=inf;
        prec[i]=0;//
    }
    elem aux,aux2;
    for(i=1;i<=k;i++)
    {
        cin>>x;
        d[x]=0;
        aux.val=0;
        aux.ind=x;//
        aux.parinte=x;
        coada.push(aux);
    }
    int a,b,c;
    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;
        v[a].push_back(make_pair(c,b));
        v[b].push_back(make_pair(c,a));
    }

    list<pair<int,int> >::iterator it;

    while(!coada.empty())
    {
        aux=coada.top();
        coada.pop();
        if(!viz[aux.ind])
        {
            viz[aux.ind]=1;
            for(it=v[aux.ind].begin();it!=v[aux.ind].end();it++)
            {
                if((d[aux.ind]+it->val)<d[it->ind])
                {
                    d[it->ind]=(d[aux.ind]+it->val);
                    aux2.ind=it->ind;
                    aux2.val=d[it->ind];
                    aux2.parinte=aux.parinte;
                    prec[it->ind]=aux.parinte;
                    coada.push(aux2);
                }
            }
        }
    }
/////////////////////////////////////
    for(i=1;i<=n;i++)
        cout<<prec[i]<<' ';
    cout<<'\n';
    cin.close();
    cout.close();
    return 0;
}