Cod sursa(job #1118460)

Utilizator cristitamasTamas Cristian cristitamas Data 24 februarie 2014 11:17:49
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define Nmax 2050
using namespace std;

vector <pair <int, int> > Graf[Nmax];
priority_queue < pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > Coada;
int D[Nmax][Nmax];

int N,M,K;
int Ksir[20];

int DP[20][1<<20];
int Minim;


void Citire()
{
    int x,y,c;
    scanf("%d %d",&N,&M);
    scanf("%d ",&K);
    Ksir[1]=1;
    for(int i=2;i<=K+1;++i)
            scanf("%d ",&Ksir[i]);
    K++;
    Ksir[++K]=N;
    for(int i=1;i<=M;++i)
    {
        scanf("%d %d %d",&x,&y,&c);
        Graf[x].push_back(make_pair(c,y));
        Graf[y].push_back(make_pair(c,x));
    }
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j)
            if(i!=j)
                D[i][j]=INF;

}

void Dijkstra(int i)
{
    Coada.push(make_pair(0,i));
    while(!Coada.empty())
    {
        int t=Coada.top().second;
        Coada.pop();
        for(int j=0;j<Graf[t].size();++j)
        {
            int v=Graf[t][j].second;
            int c=Graf[t][j].first;
            if(D[i][v]>D[i][t]+c)
            {
                D[i][v]=D[i][t]+c;
                Coada.push(make_pair(D[i][v],v));
            }
        }
    }
}

void Formare()
{
    for(int i=1;i<=K;++i)
        for(int s=1;s<=2<<K-1;++s)
            if(s==(1<<i))
                DP[i][s]=D[1][i];
            else
                DP[i][s]=INF;
}

void Rezolvare()
{
    for(int s=1;s<=(1<<K)-1;++s)
        for(int i=1;i<=K;++i)
        {
            int Min=DP[i][s];
            for(int j=1;j<=K;++j)
                if(j!=i && (s & (1<<j)))
                    if(Min>DP[j][s-(1<<i)]+D[i][j])
                        Min=DP[j][s-(1<<i)]+D[i][j];
            DP[i][s]=Min;
        }
    Minim=INF;
    for(int i=1;i<=K;++i)
        if(DP[i][N]<Minim)
            Minim=DP[i][N];
}


int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    Citire();
    for(int i=1;i<=K+2;++i)
        Dijkstra(Ksir[i]);
    Formare();
    Rezolvare();
    if(Minim<INF)
        printf("%d",Minim);
    else
        printf("%d",0);
    return 0;
}