Cod sursa(job #3309421)

Utilizator LucaWalucaLuca Munteanu LucaWaluca Data 4 septembrie 2025 14:49:42
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
vector<vector<pair<int,int>>> grf;
int dist[2005];
void dijkstra(int nr, int n)
{
	priority_queue<pair<int, int>> proq;
	proq.push({-dist[nr],nr});
	dist[0] = 0;
	while (!proq.empty()) {
		int node = proq.top().second;
		int cost = -proq.top().first;
		proq.pop();
		if (cost != dist[node])
            continue;
		for (int i = 0; i < grf[node].size(); i++)
        {
			int next = grf[node][i].first;
			int c = grf[node][i].second;
			if (cost + c < dist[next])
            {
				dist[next] = cost + c;
				proq.push({-dist[next], next});
			}
		}
	}
}
int maxi[20][20];
int Hamilton(int n)
{
	vector<vector<int>> dp((1 << n),vector<int>(n, (1<<29)));
	dp[1][0] = 0;
	for (int mask=2;mask<dp.size();mask++)
    {
		if((mask&1)==0)
            continue;
		for (int i=0;i<n;i++)
		{
			if((mask&(1 << i))==0)
                continue;
			for (int j=0;j<n;j++)
			{
				if((mask&(1 << j))==0)
                    continue;
				dp[mask][i] = min(dp[mask ^ (1 << i)][j] + maxi[j][i], dp[mask][i]);
			}
		}
	}
    return dp[(1<<n)-1][n-1];
}
int v[20];
int main()
{
    int n,m,k,a,b,c;
    in>>n>>m>>k;
    v[0]=1;
    v[k+1]=n;
    for(int i=1;i<=k;i++)
        in>>v[i];
    for(int i=1;i<=m;i++)
    {
        in>>a>>b>>c;
        grf[a].push_back({b, c});
        grf[b].push_back({a, c});
    }
    for(int i=0;i<=k+1;i++)
    {
        for(int j=0;j<=k+1;j++)
            maxi[i][j]=1e9;
    }
    for(int i=0;i<=k+1;i++)
    {
        dijkstra(v[i],n);
        for(int j=0;j<=k+1;j++)
            maxi[i][j]=dist[v[j]];
    }
    out<<Hamilton(k+2);
    return 0;
}