Cod sursa(job #2301861)

Utilizator EmplopiStefan Nitu Emplopi Data 13 decembrie 2018 16:42:26
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
#define INF 2000000000

std::priority_queue <std::pair<int, int> > pq;
std::vector <std::pair<int, int> > graph[2001];
int dist[2001][2001], v[20], ;
bool folosit[2001];


int minim(int a, int b){
    if(a<b)
        return a;
    return b;
}

int main(){
    FILE *fin, *fout;
    int n, k, rsp, m, i, nr, a, b, c, x, y, ii, jj, j, dx, dxy, iii;
    fin=fopen("ubuntzei.in", "r");
    fout=fopen("ubuntzei.out", "w");
    fscanf(fin, "%d%d%d", &n, &m, &k);
    for(i=0;i<k;i++)
        fscanf(fin, "%d", &v[i+1]);
    for(i=0;i<m;i++){
        fscanf(fin, "%d%d%d", &a, &b, &c);
        graph[a].push_back({c, b});
    }
    for(iii=1;iii<=k;iii++){
        ii=v[iii];
        for(i=1;i<=n;i++)
            dist[ii][i]=INF;
        dist[ii][ii]=0;
        pq.push({-dist[ii][ii], 1});
        while(!pq.empty()){
            while(!pq.empty() && folosit[pq.top().second])
                pq.pop();
            if(!pq.empty()){
                dx=-pq.top().first;
                x=pq.top().second;
                folosit[x]=1;
                for(i=0;i<graph[x].size();i++){
                    dxy=graph[x][i].first;
                    y=graph[x][i].second;
                    if(dist[ii][x]+dxy<dist[ii][y]){
                        dist[ii][y]=dist[ii][x]+dxy;
                        pq.push({-dist[ii][y], y});
                    }
                }
            }
        }
    }
    for(i=1;i<(1<<k);i++)
        for(j=1;j<=k;j++)
            d[i][j]=INF;
    for(i=3;i<(1<<k);i+=2){
        for(j=1;j<=k;j++){
            ii=i^(1<<j);
            for(jj=1;jj<=k;jj++)
                if((1<<jj&&ii && jj!=j)
                    d[i][j]=minim(d[i][j], d[ii][jj]+dist[v[jj]][j]);
        }
    }
    mini=INF;
    for(i=1;i<=n;i++)
        if(mini>d[(1<<n)-1][i]+dist[i][0])
            mini=d[(1<<n)-1][i]+dist[i][0];
    fprintf(fout, "%d", mini);
    fclose(fin);
    fclose(fout);

    return 0;
}