Cod sursa(job #2682745)

Utilizator adiaioanaAdia R. adiaioana Data 9 decembrie 2020 15:04:06
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <fstream>
#include <queue>
#define inf 9223372036854775806
#include <vector>
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
long long dp[33000], dij[2010][2010];
long long d[2010];
bool ok[2010];
vector <pair<int,int> > G[2010];
int N,M,K, P[20];
struct compare {
bool operator() (int x,int y) {
    return d[x]>d[y];
} };
priority_queue <int, vector<int>, compare> q;
int daicstra(int nod);
void scan();
int main()
{
    scan();
    for(int i=1; i<=N; ++i)
        d[i]=inf;
    if(K==0) {
        d[1]=0;
        daicstra(1);
        cout<<d[N]<<'\n';
        return 0;
    }

    for(int i=1; i<N; ++i)
    {
        d[i]=0;
        daicstra(i);
        for(int j=1; j<=N; ++j)
            if(i!=j && !dij[i][j])
                dij[i][j]=dij[j][i]=d[j], d[j]=inf, ok[j]=0;
    }
    /*
    for(int i=1; i<=N; ++i, cout<<'\n')
        for(int j=1; j<=N; ++j)
            cout<<dij[i][j]<<' ';
*/
    int config, ind=0,newcon=0, ind1=0;

    for(config=1; config<(1<<K); ++config)
        if((config&(config-1))!=0)
        {
            dp[newcon]=inf;
            for(ind=0; ind<K; ++ind)
                if(((1<<ind)&config)==0)
                {
                newcon=config|(1<<ind);
                for(ind1=0; ind1<K; ++ind1)
                    if(((1<<ind)&config)!=0)
                        dp[newcon]=min(dp[newcon],dp[config]+dij[ind][P[ind1]]);
                }
        }
        else for(ind=0; ind<K; ++ind)
            if(config==(1<<ind))
            {
                dp[config]=dij[1][P[ind]];
                break;
            }
    long long ans=dp[(1<<K)-1]+100000;
    for(ind1=0; ind1<K; ++ind1)
        ans=min(ans,dp[(1<<K)-1]+dij[P[ind1]][N]);
    cout<<ans<<'\n';
    return 0;
}

void scan()
{
    int x,y,z;
    cin>>N>>M>>K;
    for(int i=0; i<K; ++i)
        cin>>P[i];
    for(int i=1; i<=M; ++i)
    {
        cin>>x>>y>>z;
        G[x].push_back({y,z});
        G[y].push_back({x,z});
    }
}

int daicstra(int nod)
{
    int nr=0, im=0, lg=0, ox ,oc;
    pair <int,int> el;
    nr=1;
    q.push(nod);
    ok[nod]=1;
    while(!q.empty())
    {
        im=q.top(); q.pop();
        ok[im]=0;
        for(auto it: G[im])
        {
            ox=it.first;
            oc=it.second;
            if(oc+d[im]<d[ox])
            {
                d[ox]=d[im]+oc;
                if(!ok[ox])
                {
                    q.push(ox);
                    ok[ox]=1;
                }
            }
        }
    }
}