Cod sursa(job #2083923)

Utilizator cipri321Marin Ciprian cipri321 Data 8 decembrie 2017 12:26:43
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <set>
#include <vector>
#define DN 2005
#define DK 20
#define INF 2000000000
using namespace std;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
int n,m,k;
set<pair<int,int> > S;
int C[DK],DP[DK][(1<<DK)];
int  D[DK][DN];
vector<pair<int,int> > V[DN];
int rez=INF;
void dijkstra(int start,int ind)
{
    for(int i=0; i<=n; i++)
        D[ind][i]=INF;
    D[ind][start]=0;
    S.insert(make_pair(0,start));
    while(!S.empty())
    {
        pair<int,int> aux=(*S.begin());
        S.erase(S.begin());
        int nod=aux.second,cost=aux.first;
        for(auto to : V[nod])
            if(D[ind][to.first]>cost+to.second)
            {
                if(S.find(make_pair(D[ind][to.first],to.first))!=S.end())
                    S.erase(S.find(make_pair(D[ind][to.first],to.first)));
                D[ind][to.first]=cost+to.second;
                S.insert(make_pair(D[ind][to.first],to.first));
            }
    }
}
int main()
{
    fi>>n>>m>>k;
    C[0]=1,C[k+1]=n;
    for(int i=1; i<=k; i++)
        fi>>C[i];
    for(int i=1; i<=m; i++)
    {
        int a,b,c;
        fi>>a>>b>>c;
        V[a].push_back(make_pair(b,c));
        V[b].push_back(make_pair(a,c));
    }
    for(int i=0; i<=k+1; i++)
        dijkstra(C[i],i);
    if (k==0)
    {
        fo<<D[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]=D[0][C[i]];

    for (int mask=2; mask<(1<<k); mask++)
        for (int i=1; i<=k; i++)
            if (mask&(1<<(i-1)))
                for (int j=1; j<=k; j++)
                    DP[mask][i] = min (DP[mask][i], DP[mask^(1<<(i-1))][j]+D[j][C[i]]);
    for (int i=1; i<=k; i++)
        rez = min (rez, DP[(1<<k)-1][i]+D[i][n]);
    fo<<rez;
    fi.close();
    fo.close();
    return 0;
}