Cod sursa(job #2864638)

Utilizator MokaDomos Mozes Moka Data 8 martie 2022 00:33:01
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <list>
#include <fstream>
#include <queue>
#include <vector>
struct szomszed
{
    int vegpont;
    int suly;
};
struct onmaga
{
    int szam;
    unsigned long long osszeg=0;
};
struct CompareSuly
{
    bool operator()(onmaga &p1, onmaga &p2)
    {
        return p1.osszeg > p2.osszeg;
    }
};
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
int m,n,kdb;
list<szomszed> v[2001];
int varos[20];
bool k[2001];
priority_queue<onmaga,vector<onmaga>,CompareSuly> pq;
unsigned long long minm=1844674407370955161;
bool jart[2001];
unsigned long long tav[2001];
onmaga aktualis;
onmaga on;
unsigned long long matrix[20][20];
queue<int> szell;
void dijsktra(int kezd,int index)
{
    on.szam=kezd;
    on.osszeg=0;
    pq.push(on);
    for (int i=0; i<=2000; i++)
    {
        tav[i]=184467440737095516;
    }
    for (int i=0; i<=2000; i++)
    {
        jart[i]=false;
    }
    tav[kezd]=0;
    while (!pq.empty())
    {
        aktualis = pq.top();
        pq.pop();
            jart[aktualis.szam]=true;
            for (szomszed l : v[aktualis.szam])
            {
                unsigned long long tavolsag=aktualis.osszeg+l.suly;
                if(jart[l.vegpont]!=true)
                {
                    if(tav[l.vegpont]>tavolsag)
                    {
                        tav[l.vegpont]=tavolsag;
                        onmaga ledik;
                        ledik.szam=l.vegpont;
                        ledik.osszeg=tav[l.vegpont];
                        pq.push(ledik);
                    }
                }
        }
    }
    /*for (int i=0;i<=kdb+1;i++){
        if(index!=i)
        {
        matrix[index][i]=tav[varos[i]];
        cout<<tav[varos[i]]<<" ";
        }
        else{
            cout<<"*"<<" ";
        }
    }
    cout<<endl;*/
}
bool volt[20];
void rekurzio(int szam,int osszeg,int db)
{
    if(szam==0){
        for (int i=1;i<=kdb;i++){
            volt[i]=true;
            rekurzio(i,osszeg+matrix[0][i],db+1);
            volt[i]=false;
        }
    }
    else if(db==kdb)
    {
        if(minm>osszeg+matrix[szam][kdb+1]){
            minm=osszeg+matrix[szam][kdb+1];
        }
    }
    else{
        for (int i=2;i<=kdb;i++)
        {
            if(!volt[i]){
                volt[i]=true;
                rekurzio(i,osszeg+matrix[szam][i],db+1);
                volt[i=false];
            }
        }
    }
}
int main()
{
    cin>>n>>m>>kdb;
    varos[0]=1;
    for (int i=1; i<=kdb; i++)
    {
        cin>>varos[i];
    }
    varos[kdb+1]=n;
    for (int i=0; i<m; i++)
    {
        int a;
        int b;
        int c;
        cin>>a>>b>>c;
        szomszed l;
        l.vegpont=b;
        l.suly=c;
        v[a].push_back(l);
        l.vegpont=a;
        v[b].push_back(l);
    }
    if(kdb==0){
        dijsktra(1,1);
        cout<<tav[varos[kdb+1]];
    }
    else{
    for (int j=0;j<=kdb+1;j++){
            dijsktra(varos[j],j);
    }
    rekurzio(0,0,0);
    cout<<minm;
    }
    return 0;
}