Cod sursa(job #2856981)

Utilizator VipioanaMirea Oana Teodora Vipioana Data 24 februarie 2022 18:15:58
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int N=2e3+1;
const int K=15;
const int inf=1e9;
int n,m,k,np;
int c[K+2][K+2],d[1<<(K+2)][K],p[K+2],poz[N+1],dist[N+1];
vector <pair<int,int>> a[N+1];
priority_queue <pair<int,int>> h;

void dijkstra(int nod){
    for(int i=1; i<=n; i++)
        dist[i]=inf;
    bitset <N+1> selectat;
    dist[nod]=0;
    h.push({0,nod});
    while(!h.empty()){
        int x=h.top().second;
        h.pop();
        if(selectat[x])
            continue;
        selectat[x]=1;
        for(auto p:a[x]){
            int y=p.first;
            int c=p.second;
            if(dist[x]+c<dist[y]){
                dist[y]=dist[x]+c;
                h.push({-dist[y],y});
            }
        }
    }
    int pnod=poz[nod];
    for(int i=0; i<np; i++)
        c[pnod][i]=c[i][pnod]=dist[p[i]];
}

int hamilton(){
    for(int i=0; i<(1<<np); i++){
        for(int j=0; j<np; j++)
            d[i][j]=inf;
    }
    d[1][0]=0;
    for(int i=1; i<(1<<np); i+=2){
        for(int j=0; j<np; j++){
            if((i & (1<<j))&& d[i][j]!=inf){
                for(int k=0; k<np; k++){
                        int x=(i | (1<<k));
                        d[x][k]=min(d[x][k], d[i][j]+c[j][k]);

                }
            }
        }
    }
    return d[(1<<np)-1][np-1];
}

int main()
{
    f>>n>>m>>k;
    p[np++]=1;
    poz[1]=0;
    for(int i=0; i<k; i++){
        f>>p[np++];
        poz[p[np-1]]=np-1;
    }
    p[np++]=n;
    poz[n]=np-1;
    for(int i=0; i<m; i++){
        int x,y,c;
        f>>x>>y>>c;
        a[x].push_back({y,c});
        a[y].push_back({x,c});
    }
    for(int i=0; i<np; i++)
        dijkstra(p[i]);
    g<<hamilton();
    return 0;
}