Cod sursa(job #2865465)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 8 martie 2022 20:36:16
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k;
int ks[32];
int kdist[32][32];
vector< pair<int, int> > a[2048];
queue<int> Q;
int fol[2048];
int d[2048];

void belman(int x)
{
    Q.push(x);
    fol[x] = 1;
    d[x] = 1;

    while(!Q.empty())
    {
        int nod = Q.front();
        Q.pop();
        fol[nod] = 0;

        for(int j = 0; j<a[nod].size();++j)
        {
            int vec = a[nod][j].first;
            int cost = a[nod][j].second;

            if(!d[vec] || d[vec] > d[nod] +cost)
            {
                d[vec] = d[nod] + cost;
                Q.push(vec);
                fol[vec] = 1;
            }
        }
    }
}

void afisd()
{
    for(int i = 1; i<=n; ++i)
        g<<d[i]<< " ";
    g<<"\n";
}

int main()
{
    f>>n>>m;
    f>>k;
    for(int i=1; i<=k ; ++i)
        f>>ks[i];

    for(int i=1; i<=m; ++i)
    {
        int x,y,z;
        f>>x>>y>>z;
        a[x].push_back(make_pair(y,z));
        a[y].push_back(make_pair(x,z));
    }

    ks[0] = 1;
    for(int i = 0; i<=k; ++i)
    {
        memset(fol, 0, sizeof(fol));
        memset(d, 0, sizeof(d));

        belman(ks[i]);
       /* for(int j = 0; j<=k; ++j)
            if(j!=i)
                kdist[i][j] = d[ks[j]]-1;
        kdist[i][k+1] = d[n]-1;*/

        //afisd();
    }

  /*  for(int i=0; i<=k; ++i)
    {
        for(int j = 1; j<=k+1; ++j)
            g<<kdist[i][j]<<" ";
        g<<"\n";
    }*/

    int p[32];
    memset(p, 0, sizeof(p));

    for(int i =1; i<=n; ++i)
        p[i]=i;

    int lmin = 2000000000;

    if (k == 0)
        lmin = kdist[0][k+1];
    else
    {
        do
        {
            int lcand = kdist[0][p[1]];
            for(int i = 1; i<k; ++i)
                lcand += kdist[p[i]][p[i+1]];
            lcand += kdist[p[k]][k+1];

            if(lcand < lmin)
                lmin = lcand;

        }while(next_permutation(p+1, p+k+1));
    }

    g<<lmin<<"\n";

    return 0;
}