Cod sursa(job #2512089)

Utilizator baltoi.teodorTeodor Baltoi baltoi.teodor Data 20 decembrie 2019 15:58:25
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <bits/stdc++.h>
#define ff first
#define ss second
#define NMAX 2005
#define pb push_back
using namespace std;
const string file = "ubuntzei";

ifstream fin (file+".in");
ofstream fout (file+".out");
typedef long long ll;
typedef long double ld;

const ll INF = 9223372036854775807ll;
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, inf = 2147483647;

vector <pair <int, int > > v[NMAX];
bool viz[NMAX];
int D[20][20];  // distante intre prt i si prt j. Prt 0 e Cluj, prt K+1 e Vama
int loc[NMAX];
int dist[NMAX];
queue <int> Q;
void bfs(int x)
{

    viz[x] = 1;
    dist[x] =0;
    Q.push(x);
    while(Q.size())
    {
        int nodc = Q.front();
        viz[nodc] = 0;
        Q.pop();
        for (auto nodvecin:v[nodc])
        {
            if(dist[nodvecin.first] > dist[nodc] + nodvecin.second)
            {
                dist[nodvecin.first] = dist[nodc] + nodvecin.second;
                if(!viz[nodvecin.first]) Q.push(nodvecin.first), viz[nodvecin.first] =1;
            }
        }
    }
    Q = queue<int>();
}
int Dc; // distanta curenta
int sol[20] ; // ordinea random din back
int min1= INT_MAX;
int K,N, M;
int plshelp[NMAX];
void bkt(int p)
{
    if (p == K + 1)
    {
        Dc += D[plshelp[loc[sol[K]]]][K+1];
        if(Dc < min1) min1=Dc;
    }
    else{
        for(int i=1;i<=K;++i)
            if(!viz[i])
        {
            if(p==1)
            {
            if(D[0][plshelp[loc[i]]] < min1){
                    Dc+=D[0][plshelp[loc[i]]];
                    viz[i] = 1;
                    sol[1]=i;
                    bkt(p+1);
                    viz[i] = 0;
                    Dc-=D[0][plshelp[loc[i]]];
            }
            }
            else
            {if(Dc+D[plshelp[loc[sol[p-1]]]][plshelp[loc[i]]] < min1)
            {
                Dc+=D[plshelp[loc[sol[p-1]]]][plshelp[loc[i]]];
                viz[i] = 1;
                sol[p]=i;
                bkt(p+1);
                viz[i] = 0 ;
                Dc-=D[plshelp[loc[sol[p-1]]]][plshelp[loc[i]]];
            }
            }
        }
    }
}
int main()
{
    int x,y,c;
    fin>>N>>M;
    fin >> K;
    for(int i=1;i<=K;++i)
        {fin>>loc[i];plshelp[loc[i]]=i;}
    loc[0]=1;
    loc[K+1]=N;
    for(int i=1;i<=M;++i)
    {
        fin>>x>>y>>c;
        v[x].pb({y,c});
        v[y].pb({x,c});
    }
    for(int i=0; i<=K+1 ; ++i)
    {
        for(int j=1;j<=N;++j) viz[j]=0, dist[j]=INT_MAX;
        bfs(loc[i]) ;
        for(int j=0;j<=K+1;j++)
            D[i][j] = dist[loc[j]];

    }
    for(int i=1;i<=K;++i) viz[i]=0;
    bkt(1);
    fout << min1<<"\n";
    return 0;
}