Cod sursa(job #2322907)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 18 ianuarie 2019 16:28:10
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pinf 10000000000000010
#define s second
#define f first
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector <pair<int,int> > v[2010];
priority_queue <pair <int,int>,vector<pair<int,int> >,greater< pair<int,int > > > q;
pair <int,int> p;
long long N,M,a[2010][2010],i,j,k,o[20],x,y,z,m[32780][20],c,rez,K,l,r,viz[2010],ans[2010],ok;
int main()
{

    fin>>N>>M>>K;
    for(i=0; i<K; i++)
        fin>>o[i];
    for(i=1; i<=M; i++)
    {
        fin>>x>>y>>z;
        v[x].push_back(make_pair(z,y));
        v[y].push_back(make_pair(z,x));
    }


    //

    for(r=0; r<K; r++)
    {
        for(auto it:v[o[r]])
        {
            q.push(it);
        }
        viz[o[r]]=1;
        while(q.empty()!=1)
        {
            p=q.top();
            q.pop();
            if(viz[p.s]==0)
            {
                ans[p.s]=p.f;
                for(auto it:v[p.s])
                {
                    q.push(make_pair(ans[p.s]+it.f,it.s));
                }
                viz[p.s]=1;
            }
        }
        for(i=1; i<=N; i++)
        {
            a[o[r]][i]=ans[i];
            a[i][o[r]]=ans[i];
            viz[i]=0;
        }
    }
    if(K==0)
    {
        for(auto it:v[1])
        {
            q.push(it);
        }
        viz[1]=1;
        while(q.empty()!=1)
        {
            p=q.top();
            q.pop();
            if(viz[p.s]==0)
            {
                ans[p.s]=p.f;
                for(auto it:v[p.s])
                {
                    q.push(make_pair(ans[p.s]+it.f,it.s));
                }
                viz[p.s]=1;
            }
        }
        ok=ans[N];
    }

    //


    for(i=1; i<(1<<K); i++)
    {
        for(j=0; j<K; j++)
            m[i][j]=pinf;
    }
    c=-1;

    for(i=1; i<(1<<K); i=i<<1)
    {
        c++;
        m[i][c]=a[o[c]][1];
    }
    for(i=1; i<(1<<K); i++)
        for(l=0; l<K; l++)
        {
            if((i&(1<<l))==(1<<l))
                for(j=0; j<K; j++)
                    if((i&(1<<j))!=(1<<j))
                    {
                        m[i+(1<<j)][j]=min(m[i+(1<<j)][j],m[i][l]+a[o[l]][o[j]]);

                    }
        }
    i=(1<<K)-1;
    rez=pinf;
    for(j=0; j<K; j++)
    {
        rez=min(rez,m[i][j]+a[N][o[j]]);
    }

    if(K==0)
        fout<<ok;
    else
        fout<<rez;
}