Cod sursa(job #1904696)

Utilizator delia_99Delia Draghici delia_99 Data 5 martie 2017 18:51:25
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <vector>
#include <queue>
#define PII pair <int, int>

using namespace std;

const int KMAX=15;
const int NMAX=200;
const int inf=2e9;

int n,m,k,i;
int ind[NMAX+5],D[NMAX+5][(1<<KMAX)+5];
bool town[NMAX+5],ok[NMAX+5][(1<<KMAX)+5];
vector < PII > G[NMAX+5];
queue < PII > q;


void bellman()
{
    int i,j,node,mask,s,son,cost,mask2;

    for(i=1; i<=n; ++i)
        for(j=0; j<(1<<k); ++j)
            D[i][j]=inf;

    q.push(make_pair(1,0));
    D[1][0]=0;

    while(!q.empty())
    {
        node=q.front().first;
        mask=q.front().second;
        q.pop();
        ok[node][mask]=0;

        s=G[node].size();
        for(i=0; i<s; ++i)
        {
            son=G[node][i].first;
            cost=G[node][i].second;
            mask2=mask;

            if(town[son])
                mask2|=1<<(ind[son]-1);

            if(D[node][mask]+cost<D[son][mask2])
            {
                if(!ok[son][mask2])
                    q.push(make_pair(son,mask2));
                D[son][mask2]=D[node][mask]+cost;
                ok[son][mask2]=1;
            }
        }
    }
}

int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);

    scanf("%d%d%d",&n,&m,&k);

    for(i=1; i<=k; ++i)
    {
        int x;
        scanf("%d",&x);
        town[x]=1;
        ind[x]=i;
    }

    for(i=1; i<=m; ++i)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        G[x].push_back(make_pair(y,z));
        G[y].push_back(make_pair(x,z));
    }

    bellman();

    printf("%d\n",D[n][(1<<k)-1]);

    return 0;
}