Cod sursa(job #2925781)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 16 octombrie 2022 00:13:45
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
///ubuntzei
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <set>
#import <deque>
#import <queue>
#import <cassert>
#import <cmath>
#import <cstring>
#import <cctype>
#import <cstdlib>
#import <stack>
#import<unordered_map>
#import<ctime>
#import<chrono>
///mda atat de neinspirat sunt
#define int long long
struct ce
{
    int x,val;
    ce(){}
    ce(int _x,int _val) : x(_x) , val(_val){}
    bool operator ()(ce a,ce b)
    {
        return (this->val > b.val);
    }
};
struct edge
{
    int cost,to;
    edge(int _to,int _cost):to(_to),cost(_cost){}
};
int cost[20][20];
main()
{
    using namespace std;
    ifstream cin("ubuntzei.in");
    ofstream cout("ubuntzei.out");
    vector<vector<int>>cost(20,vector<int>(20,1e14));
    int n,m;
    cin>>n>>m;

    ///pregatire pt dinamica
    map<int,int>mp;
    int c;cin>>c;
    mp[1]=0;
    for(int i=1;i<=c;i++)
    {
        int x;cin>>x;
        mp[x]=i;
    }
    mp[n]=c+1;


    vector<vector<edge>>a(n+1);
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        cin>>x>>y>>c;
        a[x].push_back(edge(y,c));
        a[y].push_back(edge(x,c));
    }

    auto dij=[&](int start)
    {
        priority_queue<ce,vector<ce>,ce>q;
        vector<int>val(n+1,1e17);
        val[start]=0;
        q.push(ce(start,0));
        while(!q.empty())
        {
            auto acm=q.top();
            q.pop();
            if(val[acm.x]!=acm.val)continue;
            for(auto c:a[acm.x])
            {
                if(val[c.to]>val[acm.x]+c.cost)
                {
                    val[c.to]=val[acm.x]+c.cost;
                    q.push(ce(c.to,val[c.to]));
                }
            }
        }
        for(int i=start+1;i<=n;i++)
        {
            if(mp.count(i))
            {
                cost[mp[start]][mp[i]]=val[i];
            }
        }
    };
    for(int i=1;i<=n;i++)
    {
        if(mp.count(i))
        {
            dij(i);
        }
    }
    c+=2;
    vector<vector<int>>dp((1<<c),vector<int>(c,1e17));
    dp[1][0]=0;
    for(int i=3;i<(1<<c);i+=2)
    {
        for(int j=0;j<c;j++)
        {
            if(i&(1<<j))
            {
                for(int k=0;k<c;k++)
                {
                    dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+cost[min(j,k)][max(j,k)]);
                }
            }
        }
    }
    cout<<dp[(1<<c)-1][c-1];

}