Cod sursa(job #583623)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 21 aprilie 2011 13:55:53
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda just4fun Marime 2.13 kb
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>
#include<bitset>

#define DIM 2005
#define pb push_back
#define mp make_pair
#define fs first
#define sc second

vector <pair<int ,int> > lst[DIM];
int d[20][DIM],a[20],n,k,akm,b[1<<18][20],sol;
bitset <DIM> v;

struct cmp
{
    bool operator () (const int &a,const int &b) const
    {
        return d[akm][a]>d[akm][b];
    }
}; priority_queue <int, vector<int>, cmp> h;

inline void dijkstra ()
{
    int nr,i;
    v.reset ();
    for(i=1;i<=n;++i)
        d[akm][i]=1<<30;
    d[akm][a[akm]]=0;

    h.push (a[akm]);
    while(!h.empty ())
    {
        nr=h.top ();
        v[nr]=0;
        h.pop ();
        for(i=0;i<lst[nr].size ();++i)
            if(d[akm][nr]+lst[nr][i].sc<d[akm][lst[nr][i].fs])
            {
                d[akm][lst[nr][i].fs]=d[akm][nr]+lst[nr][i].sc;
                if(v[lst[nr][i].fs]==0)
                {
                    v[lst[nr][i].fs]=1;
                    h.push (lst[nr][i].fs);
                }
            }
    }
}

int main ()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    int i,j,p,nr1,nr2,nr3,m;

    scanf("%d%d%d",&n,&m,&k);
    a[0]=1;
    for(i=1;i<=k;++i)
        scanf("%d",&a[i]);
    a[k+1]=n;

    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&nr1,&nr2,&nr3);
        lst[nr1].pb (mp (nr2,nr3));
        lst[nr2].pb (mp (nr1,nr3));
    }

    for(i=0;i<=k+1;++i)
    {
        akm=i;
        dijkstra ();
    }
    if(k==0)
    {
        printf("%d\n",d[1][1]);
        return 0;
    }
    for(i=1;i<(1<<k);++i)
        for(j=1;j<=k;++j)
            b[i][j]=1<<30;

    for(i=1;i<=k;++i)
        b[1<<(i-1)][i]=d[0][a[i]];

    for(i=1;i<(1<<k);++i)
        for(j=1;j<=k;++j)
            if((i|(1<<(j-1)))==i)
                for(p=1;p<=k;++p)
                    if((i|(1<<(p-1)))!=i)
                        b[i|(1<<(p-1))][p]=min(b[i|(1<<(p-1))][p],b[i][j]+d[j][a[p]]);

    sol=1<<30;
    for(i=1;i<=k;++i)
        sol=min(sol,b[(1<<k)-1][i]+d[k+1][a[i]]);
    printf("%d\n",sol);

    return 0;
}