Cod sursa(job #1967414)

Utilizator MithrilBratu Andrei Mithril Data 16 aprilie 2017 16:48:10
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
#define NMAX 2005
#define KMAX 18
#define INF 0x3f3f3f3f
#define GET_SIZE(x) (((double)sizeof(x))/1024/1024)

using namespace std;

typedef pair<int,int> wow;

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

int n,k,m,t;
int costK[KMAX][KMAX];
int dist[NMAX];
vector<wow> g[NMAX];
int buddy[NMAX];
priority_queue<wow,vector<wow>,greater<wow> > pq;
int dp[(1<<KMAX)][KMAX];

void dijkstra(int s) {
    pq.push({0,s});
    fill(dist+0,dist+n+1,INF);
    dist[s]=0;
    for(;pq.size();pq.pop()) {
        int currNode = pq.top().second;
        int currDist = pq.top().first;

        for(auto q:g[currNode]) {
            int nextN = q.first;
            int costM = q.second;
            if(dist[nextN]>dist[currNode]+costM) {
                dist[nextN]=dist[currNode]+costM;
                pq.push({dist[nextN],nextN});
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    memset(dp,INF,sizeof(dp));

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

    for(int i=1;i<=m;i++) {
        int x,y,z;
        fin>>x>>y>>z;
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }

    for(int i=0;i<=k;i++) {
        dijkstra(buddy[i]);
        for(int j=0;j<=k;j++) {
            costK[i][j]=dist[buddy[j]];
        }
        costK[i][i]=0;
    }

    dp[1][0]=0;
    int stareFinala=(1<<(k+1))-1;
    for(int stare=1;stare<=stareFinala;stare++) {
        for(int i=0;i<=k;i++) {
            if((stare&(1<<i))==0) continue;
            for(int j=0;j<=k;j++) {
                if(i==j) continue;
                if(stare&(1<<j)) continue;
                dp[stare|(1<<j)][j]=min(dp[stare|(1<<j)][j],dp[stare][i]+costK[i][j]);
            }
        }
    }
    fout<<dp[stareFinala][k];
    return 0;
}