Cod sursa(job #1902941)

Utilizator MithrilBratu Andrei Mithril Data 4 martie 2017 21:09:31
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

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

typedef pair<int,int> wow;
const int KMAX = 18;
const int NMAX = 2005;
const int INF = 0x3f3f3f3f;
int t,nodVecin,costMuchie,cDist,cNode,m,n,k,x,y,z;
int buddy[NMAX],dist[NMAX];
int dp[(1<<KMAX)][KMAX];
vector<wow> g[NMAX];
int cost[KMAX][KMAX];

void dijkstra(int cNode) {
    memset(dist,INF,sizeof(dist));
    dist[cNode]=0;
    priority_queue<wow,vector<wow>,greater<wow> > Q;
    Q.push(make_pair(0,cNode));

    while(Q.size()) {
        cDist=Q.top().first;
        cNode=Q.top().second;
        Q.pop();

        if(cDist>dist[cNode]) continue;

        for(auto q:g[cNode]) {
            nodVecin = q.first;
            costMuchie = q.second;

            if(dist[nodVecin]>cDist+costMuchie) {
                dist[nodVecin]=cDist+costMuchie;
                Q.push(make_pair(dist[nodVecin],nodVecin));
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    buddy[0]=1;
    for(int i=1;i<=k;i++) {
        fin>>buddy[i];
    }
    buddy[++k]=n;

    for(int i=1;i<=m;i++) {
        fin>>x>>y>>z;
        g[x].push_back(make_pair(y,z));
        g[y].push_back(make_pair(x,z));
    }
    for(int i=0;i<=k;i++) {
        dijkstra(buddy[i]);
        for(int j=0;j<=k;j++) {
            cost[i][j]=dist[buddy[j]];
        }
        cost[i][i]=0;
    }

    memset(dp,INF,sizeof(dp));
    dp[1][0]=0;
    const int maxConf = (1<<(k+1));

    for(int conf=1;conf<maxConf;conf++) {
        for(int i=0;i<=k;i++) {
            if(conf&(1<<i)) {
                for(int j=0;j<=k;j++) {
                    if(conf&(1<<j)) {
                        dp[conf][i] = min(dp[conf][i],dp[(conf^(1<<i))][j]+cost[j][i]);
                    }
                }
            }
        }
    }
    fout<<dp[maxConf-1][k]<<'\n';
    fin.close();
    fout.close();
    return 0;
}