Cod sursa(job #2038577)

Utilizator vancea.catalincatalin vancea.catalin Data 13 octombrie 2017 20:11:41
Problema Ubuntzei Scor 80
Compilator cpp Status done
Runda hlo_cj_av_l2 Marime 2.12 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#define INF 1999999999
#define PW (1<<15)
#define DN 2005
#define DK 17
using namespace std;

fstream fin("ubuntzei.in",ios::in),fout("ubuntzei.out",ios::out);

vector<pair<int,int>> v[DN];
priority_queue<pair<int,int> > p;
int N,M,K,k[DK],d[DK][DN],bst[PW+4][DK];

void dijkstra(int nod);
void citire();
void citire()
{
    int i,a,b,c;
    fin>>N>>M>>K;k[K]=1;
    for(i=0;i<K;i++) fin>>k[i];
    for(i=0;i<M;i++)
    {
        fin>>a>>b>>c;
        v[a].push_back({b,c});
        v[b].push_back({a,c});
    }
}

void dijkstra(int nod)
{
    int c,x,y,cost,aux,i;
    for(i=1;i<=N;i++) d[nod][i]=INF;
    p.push({0,k[nod]}); d[nod][k[nod]]=0;
    while(p.empty()==0)
    {
        c=-p.top().first;x=p.top().second;p.pop();
        for(i=0;i<v[x].size();i++)
        {
            y=v[x][i].first;cost=v[x][i].second;
            if(d[nod][y]>c+cost)
            {
                d[nod][y]=c+cost;
                p.push({-d[nod][y],y});
            }
        }
    }
}

int main()
{
    int msk1,msk2,msk3,i,j,t1,t2,minim=INF;
    citire();
    for(i=0;i<=K;i++) dijkstra(i);
    for(i=0;i<K;i++) for(msk1=1;msk1<(1<<K);msk1++) bst[msk1][i]=INF;

    for(i=0;i<K;i++) bst[(1<<i)][i]=d[K][k[i]];
    for(msk1=1;msk1<(1<<K);msk1++)
    {
        for(t1=0;t1<K;t1++)
        {
            if((msk1&(1<<t1)))//t1-ul se gaseste in msk
            {
                for(t2=0;t2<K;t2++)
                {
                    if((msk1&(1<<t2))==0)//t2 nu se gaseste in msk
                    {
                        msk2=(msk1|(1<<t2));
                        if(bst[msk2][t2]>bst[msk1][t1]+d[t1][k[t2]])
                        {
                            bst[msk2][t2]=bst[msk1][t1]+d[t1][k[t2]];
                        }
                    }
                }
            }
        }
    }
    //cout<<bst[1][0]<<" "<<bst[2][1]<<" "<<bst[3][0]<<" "<<bst[3][1]<<"\n";
    for(i=0;i<K;i++)
    {
        if(minim>=bst[(1<<K)-1][i]+d[i][N])
        {
            minim=bst[(1<<K)-1][i]+d[i][N];
            //cout<<i<<" "<<bst[(1<<K)-1][i]<<" "<<d[i][N]<<"\n";
        }
    }
    fout<<minim;
}