Cod sursa(job #2007554)

Utilizator tanasaradutanasaradu tanasaradu Data 3 august 2017 11:52:51
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>
#define oo LONG_MAX
using namespace std;
const int nmax=2001;
const int kmax=16;
int drumuri[nmax][nmax],n,m,k,prieteni[kmax],dist[nmax],st[nmax],top,solmin=LONG_MAX;
bitset<nmax>viz;
vector<pair<int,int> >L[nmax];
priority_queue<pair<int,int> >mn;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
inline void Read()
{
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
        fin>>prieteni[i];
    for(int i=1;i<=m;i++)
    {
        int x,y,cost;
        fin>>x>>y>>cost;
        L[x].push_back({y,cost});
        L[y].push_back({x,cost});
    }
}
inline void Reset()
{
    viz.reset();
    for(int i=1;i<=n;i++)
        dist[i]=oo;
}
inline void Dijkstra(int varf)
{
    dist[varf]=0;
    mn.push({dist[varf],varf});
    while(!mn.empty())
    {
        int x=mn.top().second;
        mn.pop();
        if(!viz[x])
        {
            viz[x]=1;
            for(int i=0;i<L[x].size();i++)
            {
                int p=L[x][i].first;
                int q=L[x][i].second;
                if(dist[p]>dist[x]+q)
                {
                    dist[p]=dist[x]+q;
                    mn.push({-dist[p],p});
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
        if(!drumuri[varf][i])
                drumuri[varf][i]=dist[i];
        else drumuri[varf][i]=min(drumuri[varf][i],dist[i]);

}
inline void Build()
{
    for(int i=1;i<=n;i++)
    {
        Reset();
        Dijkstra(i);
    }
    Reset();
}
inline void Solve()
{
    int cost=0;
    cost+=drumuri[1][st[1]];
    for(int i=1;i<k;i++)
        cost+=drumuri[st[i]][st[i+1]];
    cost+=drumuri[st[k]][n];
    solmin=min(solmin,cost);
}
inline void Back(int top)
{
    if(top==(k+1))
        Solve();
    else for(int i=1;i<=k;i++)
            if(!viz[i])
    {
        viz[i]=1;
        st[top]=prieteni[i];
        Back(top+1);
        viz[i]=0;
    }
}
int main()
{
    Read();
    Build();
    if(k==0)
        fout<<drumuri[1][n]<<"\n";
    else
    {
        Back(1);
        fout<<solmin<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}