Cod sursa(job #1076399)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 10 ianuarie 2014 09:34:22
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

typedef pair<int,int> PII;
const int INF = (1<<30);
const int NMAX = 2002;
const int MMAX = 10002;
const int KMAX = 17;

int N,M,K,KP;
int P[NMAX];
int DP[1<<KMAX][NMAX];
vector<PII> V[NMAX];

int main()
{
    int i,j,a,b,c;
    vector<PII>::iterator it;
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    scanf("%d%d%d",&N,&M,&K);
    for(i=1; i<=K; i++)
    {
        scanf("%d",&a);
        P[a]=i;
    }
    for(; M; --M)
    {
        scanf("%d%d%d",&a,&b,&c);
        V[a].push_back(make_pair(b,c));
        V[b].push_back(make_pair(a,c));
    }
    KP=1<<K;
    for(i=0;i<KP;i++)
        for(j=1;j<=N;j++)
            DP[i][j]=INF;
    DP[0][1]=0;
    for(i=0; i<KP; i++)
        for(j=1; j<=N; j++)
            for(it=V[j].begin(); it!=V[j].end(); it++)
                DP[i+(1<<(P[it->first]-1))][it->first]=min(DP[i+(1<<(P[it->first]-1))][it->first],DP[i][j]+it->second);
    printf("%d\n",DP[KP-1][N]);
    return 0;
}