Cod sursa(job #3033347)

Utilizator bogdan.schiopBogdan Schiop bogdan.schiop Data 23 martie 2023 19:35:03
Problema Ubuntzei Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define inf 2147483647

using namespace std;

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

int a[2001][2001];
int distante[2001];
int m, n, k;
int vk[2001];
int viz[2001];
int a1, a2, a3;
int dmin, poz, curr, pozcurr;

void citire()
{
    fin >> n >> m >> k;
    for(int i = 1 ; i <= k; i++)
        fin >> vk[i];
    for(int i = 1 ; i <= m; i++)
    {
        fin >> a1 >> a2 >> a3;
        a[a1][a2] = a3;
        a[a2][a1] = a3;
    }
}

void setare(int start)
{
    for(int i = 1 ; i <= n; i++)
        distante[i] = inf;
    for(int i = 1 ; i <= n; i++)
    {
        if(a[start][i] != 0)
            distante[i] = a[start][i];
    }
    distante[start] = 0;
}

void drum(int start)
{
    setare(start);
    bool ok = true;
    while(ok)
    {
        ok = false;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1 ; j <= n; j++)
                if(distante[i] + a[i][j] < distante[j] && a[i][j])
                {
                    distante[j] = distante[i] + a[i][j];
                    ok = true;
                }
        }
    }
}

int rezolvare()
{
    poz = 1;
    for(int j = 1 ; j <= k; j++)
    {

        drum(poz);
        curr = inf;
        for(int i = 1 ; i <= k; i++)
        {
            if(curr > distante[vk[i]] && vk[i] != poz && vk[i])
            {
                curr = distante[i];
                pozcurr = i;
            }
        }
        poz = pozcurr;
        vk[poz] = 0;
        dmin += curr;
    }
    drum(poz);
    dmin += distante[n];
    return dmin;
}

int main()
{
    citire();
    fout << rezolvare();
    return 0;
}