Mai intai trebuie sa te autentifici.

Cod sursa(job #1609941)

Utilizator TrascaAndreiTrasca Andrei TrascaAndrei Data 23 februarie 2016 10:22:05
Problema Ubuntzei Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#define pb push_back

using namespace std;

const int N = 10001;
const int K = 15;
const int inf = 999999999;
const char inf1[] = "ubuntzei.in";
const char outf[] = "ubuntzei.out";

int n,m,k,c[K],s[N],pd[1<<K][K],path[K][N];
vector< pair <int, int> > G[N];
set< pair <int, int> > q;

void dijkstra(int x,int *sol)
{
    int i,t;
    for(i=1;i<=n;i++)
        sol[i]=inf;
    sol[x]=0;
    q.clear();
    for(i=1;i<=n;i++)
        q.insert(make_pair(sol[i],i));
    for(i=1;i<n;i++)
    {
        pair<int,int> top=*q.begin();
        q.erase(q.begin());
        int nod=top.second;
        if(sol[nod]<top.first)
            continue;
        for(size_t j=0;j<G[nod].size();j++)
            if(sol[t=G[nod][j].first]>sol[nod]+G[nod][j].second)
            {
                sol[t]=sol[nod]+G[nod][j].second;
                q.insert(make_pair(sol[t],t));
            }
    }
}

inline int bit(int x,int nr)
{
    return (x & (1<<nr)) != 0;
}

int main()
{
    freopen(inf1,"r",stdin);
    freopen(outf,"w",stdout);
    scanf("%d %d %d",&n,&m,&k);
    int i,j,q,l;
    for(i=0;i<k;i++)
        scanf("%d",&c[i]);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&j,&q,&l);
        G[j].pb(make_pair(q,l));
        G[q].pb(make_pair(j,l));
    }
    dijkstra(1,s);
    if(k==0)
    {
        printf("%d\n",s[n]);
        return 0;
    }
    int cost=0,cost_final=inf;
    for(i=0;i<k;i++)
    {
        dijkstra(c[i],path[i]);
    }
    for(i=1;i<(1<<k);++i)
    {
        for(j=0;j<k;j++)
            if(i==(1<<j))
                break;
        if(j<k && i==(1<<j))
        {
            pd[i][j]=s[c[j]];
            continue;
        }
        for(j=0;j<k;j++)
        {
            pd[i][j]=inf;
            if(bit(i,j))
                for(q=0;q<k;q++)
                    if(q!=j && bit(i,q))
                    {
                        cost=pd[i-(1<<j)][q]+path[q][c[j]];
                        pd[i][j]=min(pd[i][j],cost);
                    }
        }
    }
    for(i=0;i<k;i++)
        cost_final=min(cost_final,pd[(1<<k)-1][i]+path[i][n]);
    printf("%d",cost_final);
    return 0;
}