Cod sursa(job #3281432)

Utilizator nusuntvictorVictor Stefan nusuntvictor Data 1 martie 2025 15:18:47
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>
#include <algorithm>
#define Nmax 2001
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

vector<vector<pair<int,int>>>graf(Nmax);
vector<int>tov;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>> >q;
vector<vector<int>>cost(Nmax,vector<int>(Nmax,1e9));
bitset<Nmax>vis;
vector<vector<int>>dp(1<<15,vector<int>(20,1e9));
int n,m,k;
void dijkstra(int node, int index){
    cost[index][node]=0;
    q.push({0,node});
    while(!q.empty()){
        pair<int,int>smallest=q.top();
        q.pop();
        if(vis[smallest.second]==1)
            continue;
        vis[smallest.second]=1;
        for(int i=0; i<(int)graf[smallest.second].size(); ++i){
            int nxt=graf[smallest.second][i].first;
            int val=graf[smallest.second][i].second;

            if(smallest.first+val<cost[index][nxt]){
                cost[index][nxt]=smallest.first+val;
                q.push({cost[index][nxt],nxt});
            }
        }
    }
}

void solve(){
    for(int i=0; i<k; ++i)
        dp[(1<<i)][i]=cost[0][tov[i+1]];

    for(int msk=0; msk<(1<<k); ++msk){
        for(int i=0; i<k; ++i){
            if(msk&(1<<i)){
                for(int j=0; j<k; ++j){
                    if((msk&(1<<j))==0){
                        int new_msk = msk^(1<<j);
                        dp[new_msk][j]=min(dp[new_msk][j],dp[msk][i]+cost[i+1][tov[j+1]]);
                    }
                }
            }
        }
    }
    int ans=1e9;
    for(int i=0; i<k; ++i)
        ans=min(ans,dp[(1<<k)-1][i]+cost[i+1][n]);
    g<<ans;
}

int main()
{

    f>>n>>m>>k;
    tov.resize(k+2);
    for(int i=1; i<=k; ++i)
        f>>tov[i];
    for(int i=1; i<=m; ++i){
        int x,y,c;
        f>>x>>y>>c;
        graf[x].push_back({y,c});
        graf[y].push_back({x,c});
    }
    tov[0]=1;
    tov[k+1]=n;
    for(int i=0; i<=k+1; ++i){
        vis.reset();
        dijkstra(tov[i],i);
    }
    if(k==0)
        g<<cost[0][n];
    else solve();

    return 0;
}