Cod sursa(job #3198751)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 30 ianuarie 2024 14:09:40
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>

#define INF 1000000000
#define DIM 2000
#define E 17

#define pii pair<int,int>
#define pipii pair<int,pii>

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k;
int x,y,c;

int v[DIM+5];

vector <pii> L[DIM+5];

int dist[DIM+5][DIM+5];
int d[(1<<(E))+5][DIM+5];

priority_queue <pii,vector<pii>,greater<pii>> q;

void dijkstra(int start){

    for(int j=1;j<=n;j++){
        dist[start][j] = INF;
    }

    dist[start][start] = 0;

    q.push({0,start});

    while(!q.empty()){
        int cost = q.top().first;
        int nod = q.top().second;
        q.pop();

        //cout<<cost<<" "<<nod<<" "<<l<<'\n';

        if(dist[start][nod] != cost){
            continue;
        }

        for(int i=0;i<L[nod].size();i++){
            int vec = L[nod][i].first;
            int c = L[nod][i].second;

            int newcost = cost + c;

            if(dist[start][vec] > newcost){
                dist[start][vec] = newcost;
                q.push({dist[start][vec],vec});
            }
        }
    }
}

int main(){

    f>>n>>m;
    f>>k;

    for(int i=1;i<=k;i++){
        f>>v[i];
    }
    v[0] = 1;
    v[++k] = n;
    k++;

    for(int i=1;i<=m;i++){
        f>>x>>y>>c;
        L[x].push_back({y,c});
        L[y].push_back({x,c});
    }


    for(int i=0;i<k;i++){
        dijkstra(v[i]);
    }

    /*for(int i = 0;i<k;i++){
        cout<<v[i]<<": ";
        for(int j=1;j<=n;j++){
            cout<<dist[v[i]][j]<<" ";
        }
        cout<<'\n';
    }*/

    for(int mask = 1;mask<(1<<k);mask++){
        for(int i=0;i<k;i++){
            d[mask][i] = INF;
        }
    }

    d[1][0] = 0;

    for(int mask = 1;mask<(1<<k);mask++){

        //cout<<mask<<" "<<'\n';

        for(int last = 0;last<k;last++){

            if(!(mask&(1<<last))){
                continue;
            }

            for(int i = 0;i<k;i++){
                if((mask&(1<<i))){
                    continue;
                }

                if(d[mask][last] == INF){
                    continue;
                }

                int newmask = mask|(1<<i);

                if(d[newmask][i] > d[mask][last] + dist[v[i]][v[last]]){
                    d[newmask][i] = d[mask][last] + dist[v[i]][v[last]];

                    //cout<<newmask<<" "<<i<<" "<<d[newmask][i]<<'\n';
                }
            }
        }

    }

    g<<d[(1<<k)-1][k-1];

    return 0;
}