Cod sursa(job #2167495)

Utilizator lorena1999Marginean Lorena lorena1999 Data 13 martie 2018 21:59:44
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define MAX 2020
#define INF 99999999
#define pp pair < int , int >

using namespace std;

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

int n, m, K, ceva[MAX], dist[2001][2001], dp[(1<<15)][15];

vector < pair < int , int > >  v[MAX];

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

void read()
    {
        int x, y, d;
        f>>n>>m;
        f>>K;
        //ceva[K+1]=n;
        for(int i=1; i<=K; i++)
            f>>ceva[i];
        for(int i=1; i<=m; i++)
        {
            f>>x>>y>>d;
            v[x].push_back({y, d});
            v[y].push_back({x, d});
        }

        ceva[0]=1;
        ceva[K+1]=n;
        for(int i=0; i<=K+1; i++)
            {
                for(int j=1; j<=n; j++)
                    dist[ceva[i]][j]=INF;
                q.push({0, ceva[i]});
                dist[ceva[i]][ceva[i]]=0;
                while(!q.empty())
                {
                    int nod = q.top().second;
                    int dis = q.top().first;
                    q.pop();
                    if(dis!=dist[ceva[i]][nod])
                        continue;
                    for(auto it:v[nod])
                    {
                        if(dist[ceva[i]][it.first]>dist[ceva[i]][nod]+it.second)
                            {
                                dist[ceva[i]][it.first] = dist[ceva[i]][nod]+ it.second;
                                q.push({dist[ceva[i]][it.first], it.first});
                            }
                    }
                }
            }
    }

int main()
    {
        read();
        if(!K)
        {
            g<<dist[1][n];
            return 0;
        }
        for(int i=0; i<(1<<K); i++)
            for(int j=0; j<=K; j++)
                dp[i][j]=INF;
        for(int i=1; i<=K; i++)
            dp[(1<<(i-1))][i] = dist[1][ceva[i]];
        for(int conf = 2; conf<(1<<K); conf++)
        {
            for(int i=1; i<=K; i++)
            {
                if((conf>>(i-1))&1)
                {
                    for(int k=1; k<=K; k++)
                    {
                        dp[conf][i] = min(dp[conf][i] , dp[conf^(1<<(i-1))][k] + dist[ceva[i]][ceva[k]]);
                    }
                }
            }
        }
        int rez=INF;
        for(int i=1; i<=K; i++)
            rez=min(rez, dp[(1<<K)-1][i] + dist[ceva[i]][n]);
        g<<rez;
        f.close();
        g.close();
    }