Cod sursa(job #2016618)

Utilizator patcasrarespatcas rares danut patcasrares Data 29 august 2017 21:00:53
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,v[2005],a,b,f=-1,y[2005],z;
vector<pair<int,int> >x[2005];
long long r[25][2005];
long long rez[(1<<16)][25],g;
queue<int>q;
void ve()
{
    int nod;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(auto i:x[nod])
        {
            if(i.first!=y[f])
                if(r[f][i.first]==0||r[f][nod]+i.second<r[f][i.first])
                {
                    r[f][i.first]=r[f][nod]+i.second;
                    q.push(i.first);
                }
        }
    }
}
int main()
{
    //cout<<sizeof(rez)/1000;
    fin>>n>>m;
    fin>>k;
    for(int i=1;i<=k;i++)
    {
        fin>>a;
        y[i]=a;
        v[a]=i;
    }
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b>>z;
        x[a].push_back(make_pair(b,z));
        x[b].push_back(make_pair(a,z));
    }
    y[0]=1;
    f++;
    q.push(1);
    ve();
    for(int i=1;i<=k;i++)
    {
        f++;
        q.push(y[i]);
        ve();
    }
    if(k==0)
    {
        fout<<r[0][n];
        return 0;
    }
    int p=(1<<k),nr,s;
    for(int i=1;i<p;i++)
        for(int j=0;j<k;j++)
            if(((1<<j)&i))
    {
        if(i==(1<<j))
            rez[i][j+1]=r[0][y[j+1]];
        //cout<<rez[i][j+1]<<'\n';
        for(int h=0;h<k;h++)
            if(!((1<<h)&i))
                if(rez[((1<<h)|i)][h+1]==0||rez[i][y[j+1]]+r[j+1][h+1]<rez[((1<<h)|i)][h+1])
                    rez[((1<<h)|i)][h+1]=rez[i][y[j+1]]+r[j+1][h+1];
    }
    long long mi=rez[p-1][1]+r[1][n];
    for(int i=2;i<=k;i++)
        mi=min(mi,rez[p-1][i]+r[i][n]);
    fout<<mi;
}