Cod sursa(job #2563023)

Utilizator CarlaDianaCarla Diana CarlaDiana Data 29 februarie 2020 21:45:42
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define inf 1000000000
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 > > >pq;
pair<int,int >tt;
int n,m,a,b,c,ap[18],k,d[18][2000],ma[524300][20];
int main()
{
    fin>>n>>m>>k;
    for(int i=0;i<k;i++)
        fin>>ap[i];
    ap[k]=1;
    ap[k+1]=n;
    for(;m;m--)
    {
        fin>>a>>b>>c;
        v[a].push_back(make_pair(c,b));
        v[b].push_back(make_pair(c,a));
    }
    ///dijkstra din cele k orase+orasul 1+orasul n
    for(int i=0;i<=k+1;i++)
    {
        ///ap[i]
        for(int j=0;j<=n;j++)
            d[i][j]=inf;
        d[i][ap[i]]=0;
        pq.push(make_pair(0,ap[i]));
        while(!pq.empty())
        {
            tt=pq.top();
            pq.pop();
            if(tt.first==d[i][tt.second])
            {
                for(auto it:v[tt.second])
                {
                    if(it.first+tt.first<d[i][it.second])
                    {
                        d[i][it.second]=it.first+tt.first;
                        pq.push(make_pair(d[i][it.second],it.second));
                    }
                }
            }
        }
    }
    if(k==0)
    {
        fout<<d[k][n];
        return 0;
    }
    int maxx=(1<<k)-1;
    for(int i=1;i<=maxx;i++)
        for(int j=0;j<k;j++)
            ma[i][j]=inf;
    for(int i=0;i<=k;i++)
    {
        ma[1<<i][i]=d[k][ap[i]];
    }


   for(int i=1;i<=maxx;i++)
    {
        for(int j=0;j<k;j++)
        {
            if(i&(1<<j))
            {
                for(int q=0;q<k;q++)
                {
                    if((i-(1<<j))&(1<<q))
                    {
                        ma[i][j]=min(ma[i][j],ma[i-(1<<j)][q]+d[q][ap[j]]);
                    }
                }
            }

        }
        ///fout<<endl;
    }
    int minn=inf;

    for(int j=0;j<k;j++)
    {
        if(d[k+1][ap[j]]!=inf)
            minn=min(minn,ma[maxx][j]+d[k+1][ap[j]]);
    }
    fout<<minn;




    /*
    cout<<k<<endl;
    for(int i=0;i<k;i++)
        cout<<ma[(1<<k)-1][i]<<" ";
    cout<<endl<<endl;
    int minn=inf;
    for(int j=0;j<k;j++)
    {
        minn=min(minn,d[k][ap[j]]);
    }
    fout<<minn<<endl;
    int minnham=inf;
    for(int j=0;j<k;j++)
    {
        cout<<ma[(1<<k)-1 ][j]<<" ";
        minnham=min(minnham,ma[(1<<k)-1 ][j]+d[j][n]);
    }
    fout<<minnham<<endl;
    fout<<minnham+minn;*/



    /*

    for(int i=2;i<k;i++)
    {
        ///fout<<ma[(1<<k)-2][i]<<" "<<ap[i]<<" "<<d[k][ap[i]]<<endl;
        minn=min(minn,ma[(1<<k)-2][i]+d[k][ap[i]]);
    }
    fout<<minn;*/



    return 0;
}
/*
for(int i=6;i<=(1<<k);i++)
        for(int j=1;j<=k;j++)
            ma[i][j]=inf;

    for(int i=1;i<=(1<<k);i++)
                ma[(1<<i)][i]=0;

    for(int i=6;i<=(1<<k)-2;i=i+4)
    {
        for(int j=2;j<k;j++)
        {
            if(i&(1<<j))
            {
                for(int h=2;h<k;h++)
                {
                    if((1<<h)&(i-(1<<j)))
                    {
                        cout<<i<<" "<<j<<" "<<ma[i][j]<<" "<<h<<" "<<d[h][ap[j]]<<endl;
                        ma[i][j]=min(ma[i][j],ma[i-(1<<j)][h]+d[h][ap[j]]);
                    }
                }

            }
        }
    }
    for(int i=2;i<k;i++)
    {
        fout<<ma[(1<<k)-2][i]<<" "<<ap[i]<<endl;
    }
*/