Cod sursa(job #3199831)

Utilizator AlexanderCernyCernaianu Alexandru AlexanderCerny Data 2 februarie 2024 18:33:59
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
/// Aceasta sursa este pentru problema
/// https://www.infoarena.ro/problema/ubuntzei
/// Punctaj: 60
/// Grupa de seniori

#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#define DIM 2001

using namespace std;

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

vector <pair<int, int>> adj[DIM + 1];
priority_queue <pair<int, int>, vector <pair<int, int>>, greater <pair<int, int>>> pq;
int dist[20][DIM];
int loc[20];
int n, m;

void djk( int s ){
	for(int i = 1; i <= n; i++)
		dist[s][i] = INT_MAX;
	dist[s][loc[s]] = 0;
	pq.push({dist[s][loc[s]], loc[s]});
	while(!pq.empty()){
		int nod = pq.top().second;
		pq.pop();
        for(auto vec : adj[nod]){
            if( dist[s][vec.first] > dist[s][nod] + vec.second){
                dist[s][vec.first] = dist[s][nod] + vec.second;
                pq.push({dist[s][vec.first], vec.first});
            }
        }
	}
}
struct muchie{
    int next;
    int costmuchie;
};
vector <muchie> g[DIM];
int dp[(1<<17) + 1][DIM];

int main()
{
    int k;
    fin >> n >> m >> k;
    for( int i = 1; i <= k; i++ )
        fin >> loc[i];
    loc[0] = 1;
    loc[k+1] = n;
    for( int i = 0; i < m; i++ ){
        int a, b, c;
        fin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }

    for( int i = 0; i <= k+1; i++ )
        djk(i);

    for( int config = 1; config < (1 << (k+2)); config++ )
        for( int curnode = 0; curnode <= k+1; curnode++ )
            dp[config][curnode] = INT_MAX;
    dp[1][0] = 0;
    for( int config = 1; config < (1 << (k+2)); config++ ){
        for( int curnode = 0; curnode <= k+1; curnode++ ){
            if( ( config & (1 << curnode)) == 0 || dp[config][curnode] == INT_MAX)
               continue;
            for( int i = 0; i <= k+1; i++ ){
                if( (config & (1 << i)) == 0 )
                    dp[config | (1 << i)][i] = min( dp[config | (1 << i)][i],
                        dp[config][curnode] + dist[curnode][loc[i]]);
            }
        }
    }
    fout << dp[(1<<(k+2))-1][k+1];
    return 0;
}