Cod sursa(job #2334728)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 2 februarie 2019 22:27:04
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>
#define F first
#define S second

using namespace std;

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

const int NR=25;
const int NODES=2005;
const int VAL=132005;
const int INF=2000000000;

int N, M, K, U[NR], i, j;
int A, B, C, nod, conf;
int cost[NR][NODES];
int dp[NR][VAL], X;
vector < pair <int, int> > G[NODES];
vector < pair <int, int> > :: iterator it;
queue <int> Q;

void BFS(int poz)
{
    cost[poz][U[poz]]=0;
    Q.push(U[poz]);
    while (Q.empty()==false)
    {
        nod=Q.front();
        Q.pop();
        for (it=G[nod].begin(); it!=G[nod].end(); it++)
        {
            if (cost[poz][it->F]>cost[poz][nod]+it->S)
            {
                cost[poz][it->F]=cost[poz][nod]+it->S;
                Q.push(it->F);
            }
        }
    }
}

int main()
{
    fin >> N >> M >> K;
    U[0]=1;
    U[++K]=N;
    for (i=1; i<K; i++)
        fin >> U[i];
    for (i=1; i<=M; i++)
    {
        fin >> A >> B >> C;
        G[A].push_back({B, C});
        G[B].push_back({A, C});
    }

    for (i=0; i<=K; i++)
    {
        for (j=1; j<=N; j++)
            cost[i][j]=INF;
        for (j=0; j<=(1 << (K+1)); j++)
            dp[i][j]=INF;
    }
    for (i=0; i<=K; i++)
        BFS(i);
    dp[0][1]=0;
    for (conf=0; conf<(1 << (K+1)); conf++)
    {
        for (i=0; i<=K; i++)
        {
            if ((conf & (1 << i))!=0)
                continue;
            for (j=0; j<=K; j++)
            {
                if ((conf & (1 << j))==0)
                    continue;
                X=dp[j][conf]+cost[j][U[i]];
                dp[i][conf+(1 << i)]=min(dp[i][conf+(1 << i)], X);
            }
        }
    }
    fout << dp[K][(1 << (K+1))-1] << '\n';
    fin.close();
    fout.close();
    return 0;
}