Cod sursa(job #2851063)

Utilizator HisuYesyes Hisu Data 18 februarie 2022 00:10:38
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#define INF INT_MAX
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int a[205][205],f[15];
int ff[205];
vector<int>v;
int V,E,R,MIN=INT_MAX;
int Floyd()
{
    for(int i=1;i<=V;i++)
        for(int j=1;j<=V;j++)
            if(!a[i][j])
                a[i][j]=INF;

    for(int i=1;i<=V;i++)
        a[i][i]=0;


    for(int k=1;k<=V;k++)
        for(int i=1;i<=V;i++)
            for(int j=1;j<=V;j++)
                if(a[i][j]>(a[i][k]+a[k][j])
                   && a[i][k]!=INF && a[k][j]!=INF)
                        a[i][j]=a[i][k]+a[k][j];

}

void sol()
{
    int sum=0;
    for(int i=1;i<=v.size();i++)
        sum+=a[f[i-1]][f[i]];

    sum+=a[1][f[1]]+a[f[v.size()]][V];
    int y=sum;
    MIN=min(MIN,y);
}

void back(int k)
{
    for(auto i:v)
    {
        if(a[f[k-1]][i]!=INF && a[f[k-1]][i]!=0 && !ff[i] || k==1)
        {
            f[k]=i,ff[i]=1;
            if(k==v.size())
                sol();
            else if(k<v.size())
                back(k+1);
            ff[i]=0;
        }
    }

}

void read()
{
    fin>>V>>E>>R;
    for(int i=1;i<=R;i++)
    {
        int y;
        fin>>y;
        v.push_back(y);
    }
    for(int i=1;i<=E;i++)
    {
        int x,y,z;
        fin>>x>>y>>z;
        a[x][y]=a[y][x]=z;
    }
}

int main()
{
    read();
    Floyd();
    f[0]=0;
    if(v.size()!=0)
        back(1);
    else
        MIN=a[1][V];
    fout<<MIN;
}