Cod sursa(job #1917623)

Utilizator CriistinaMicula Cristina Criistina Data 9 martie 2017 12:40:13
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <bitset>
#include <queue>
#define Nmax 2001
#define Kmax 15
#define Dim 1<<15
#define Max 1000000000

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

int n, m, k, ob[Kmax], init[Nmax];
vector <pair<int, int> > gr[Nmax];
int dp[Dim][Kmax], drum[Kmax][Nmax];

void dijkstra(int x, int d[])
{
    bitset <Nmax> viz;
    set <pair<int, int> > q;
    for(int i=1;i<=n;i++)
        d[i]=Max;
    d[x]=0;
    q.insert(make_pair(d[x], x));
    for(int i=1;i<=n;i++)
    {
        if(!q.empty())
        {
            while(!q.empty() && viz[q.begin()->second]==1)
                q.erase(q.begin());
            if(!q.empty())
            {
                int top=q.begin()->second;
                q.erase(q.begin());
                for(auto j:gr[top])
                {
                    if(viz[j.first]==0 && d[j.first]>d[top]+j.second)
                    {
                        d[j.first]=d[top]+j.second;
                        q.insert(make_pair(d[j.first], j.first));
                    }
                }
                viz[top]=1;
            }
        }
    }

}
int main()
{
    int i,j,l;
    f>>n>>m;
    f>>k;
    for(i=0;i<k;i++)
        f>>ob[i];
    for(i=1;i<=m;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        gr[x].push_back(make_pair(y,c));
        gr[y].push_back(make_pair(x,c));
    }
    dijkstra(1, init);
    if(k==0)
    {
        g<<init[n];
        return 0;
    }
    for(i=0;i<k;i++)
    {
        dijkstra(ob[i], drum[i]);
        dp[1<<i][i]=init[ob[i]];
    }
    for(i=0;i<(1<<k);i++)
        for(j=0;j<k;j++)
            dp[i][j]=Max;
    for(i=1;i<(1<<k);i++)
    {
        for(j=0;j<k;j++)
            if(i==(1<<j))
                break;
        if(j<k && i==(1<<j))
        {
            dp[i][j]=init[ob[j]];
            continue;
        }
        for(j=0;j<k;j++)
        {
            if((i&(1<<j))!=0)
            {
                for(l=0;l<k;l++)
                {
                    if(l!=j && (i&(1<<l))!=0)
                    {
                        dp[i][j]=min(dp[i][j], dp[i^(1<<j)][l]+drum[l][ob[j]]);
                    }
                }
            }
        }
    }
    int sol=Max;
    for(i=0;i<k;i++)
    {
        sol=min(sol, dp[(1<<k)-1][i]+drum[i][n]);
    }
    g<<sol;
    return 0;
}