Cod sursa(job #1241251)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 13 octombrie 2014 02:27:20
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <queue>
#define inf (1<<30)

using namespace std;

ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");

vector<pair <int, int> > l[2005];

queue <int> q;

int n,m,k,i,j,sol,K;

int dist [2005][2005],c[2005],di[2005],f[2005],d[20][(1<<15)],x,y,C;

inline int minim (int a, int b) {
    return (a<b?a:b);
}

void bfs (int nod) {
    int fr,sc,x;
    for (int i=1;i<=n;i++) {
        f[i]=0;
        di[i]=inf;
    }
    di[c[nod]]=0;
    q.push(c[nod]);
    while (q.size()) {
        x=q.front();
        f[x]=0;
        for (int i=0;i<l[x].size();i++) {
            fr=l[x][i].first,sc=l[x][i].second;
            if (di[x]+sc<di[fr]){
                di[fr]=di[x]+sc;
                if (!f[fr]){
                    f[fr]=1;
                    q.push(fr);
                }
            }
        }
        q.pop();
    }
     for (int i=0;i<=k+1;i++)
        dist[nod][i]=di[c[i]];
}


int main () {

    fin>>n>>m>>k;
    c[0]=1;
    for (i=1;i<=k+1;i++)
        fin>>c[i];
    c[k+1]=n;
    for (i=1;i<=m;i++) {
        fin>>x>>y>>C;
        l[x].push_back(make_pair(y,C));
        l[y].push_back(make_pair(x,C));
    }

    for (i=0;i<=k+1;i++)
        bfs(i);
    K=(1<<(k));
    for (i=0;i<=k+1;i++)
        for (j=0;j<K;j++)
            d[i][j]=inf;
    d[0][0]=0;
    for (i=0;i<K;i++)
        for (j=0;j<=k;j++)
            if (d[j][i]!=inf)
                for (x=1;x<=k;x++)
                    if ((i&(1<<(x-1)))==0)
                        d[x][i|(1<<(x-1))]=minim(d[x][i|(1<<(x-1))],d[j][i]+dist[j][x]);
    sol=inf;
    for (i=1;i<=k;i++)
        sol=minim(sol,d[i][K-1]+dist[i][k+1]);
    fout<<sol<<"\n";
    return 0;
}