Cod sursa(job #2550432)

Utilizator baltoi.teodorTeodor Baltoi baltoi.teodor Data 18 februarie 2020 19:54:03
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 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];
int dist[NMAX][NMAX],Sol=inf, possiblesol ;
int stv[20],N,M,K;
bool viz[NMAX];
int friends[NMAX];
void bfs(int nod);
void bkt(int k);
queue<int>Q;
int main()
{
    int x,y,c;
    fin >> N >> M;
    fin>>K;
    for(int i=1;i<=K;++i)
        fin>>friends[i];
    for(int i=1;i<=M;++i)
    {
        fin>>x>>y>>c;
        v[x].pb({y,c});
        v[y].pb({x,c});
    }
    friends[0]=1;
    for(int i=1;i<=K;++i)
        for(int j=1;j<=N;++j) dist[i][j]=-1;
    for (int i=1;i<=K;++i) {for(int j=1;j<=N;++j)viz[j]=0;bfs(i);}
    for(int j=1;j<=N;++j)viz[j]=0;
    bkt(1);
    fout<<Sol<<"\n";
    return 0;
}
void bfs(int nod)
{
    viz[friends[nod]]=1;
    Q.push(friends[nod]);
    dist[nod][friends[nod]]=0;
    while(Q.size())
    {
        int nodc=Q.front();
        Q.pop();
        viz[nodc]=0;
        for(auto x:v[nodc])
        {
            int nodv=x.ff;
            int cost=x.ss;

            if(dist[nod][nodv] == -1)
            {
                dist[nod][nodv] = dist[nod][nodc]+cost;
                viz[nodv]=1;
                Q.push(nodv);
            }
            else if(dist[nod][nodv] > dist[nod][nodc]+cost)
            {
                dist[nod][nodv] = dist[nod][nodc]+cost;
                if(!viz[nodv]) Q.push(nodv), viz[nodv]=1;
            }
        }
    }
}
void bkt(int k)
{
    if(k==K+1)
    {
        possiblesol+= dist[stv[K]][N];
        if(possiblesol <= Sol ) Sol = possiblesol;

    }
    else{
        for(int i=1;i<=K;++i)
            if(!viz[i])
        {
            viz[i]=1;
            stv[k]=i;
            possiblesol += dist[i][friends[stv[k-1]]];
            if(possiblesol <= Sol )
                bkt(k+1);
            possiblesol -= dist[i][friends[stv[k-1]]];
            viz[i]=0;
        }
    }
}