Cod sursa(job #2654943)

Utilizator eugen5092eugen barbulescu eugen5092 Data 2 octombrie 2020 20:54:39
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <bits/stdc++.h>

#define kmax 33000
#define INF 2000000000

using namespace std;

ifstream ci("ubuntzei.in");
ofstream cou("ubuntzei.out");

struct date{
    int nod,cost;
};

int n,m,k;
int spec[30],cost[30][30];
vector<date>v[2005];
int dis[2005];
int dp[kmax][30]; //dis min pana la nodu j trecand prin nodurile descrise de stare
queue<int>q;

void citire(){
    ci>>n>>m>>k;
    for(int i=0;i<k;i++){
        ci>>spec[i];
    }
    int a,b,c;
    date p;
    for(int i=1;i<=m;i++){
        ci>>a>>b>>c;
        p.cost=c;
        p.nod=b;
        v[a].push_back(p);
        p.nod=a;
        v[b].push_back(p);
    }

}

void Djakstra(int nod){

    int w,w1,c,y;
    w=nod;
    q.push(w);

    while(!q.empty()){
        w=q.front();
        q.pop();
        for(auto i:v[w]){
            y=i.nod;
            c=i.cost;
            if(dis[y]>dis[w]+c){
                dis[y]=dis[w]+c;
                q.push(y);
            }
        }
    }

}

void InitD(){
    int i,nod,stare;
    for(stare=0;stare<(1<<k);stare++){
        for(i=0;i<k;i++){
            dp[stare][i]=INF;
        }
    }
    for(i=1;i<=n;i++){
        dis[i]=INF;
    }
    dis[1]=0;
    InitD(1);
    for(i=0;i<=k-1;i++){
        dp[1<<i][i]=dis[spec[i]];
    }
}


void rez(){
    int i,j,stare,nod;
    int mx;
    mx=(1<<k);
    InitD();

    for(i=0;i<k;i++){
        nod=spec[i];
        for(j=1;j<=n;j++){
            dij[j]=INF;
        }
        dij[nod]=0;
        Djakstra(nod);
        for(j=0;j<k;j++){
            cost[i][j]=dij[a[j]];
        }
    }

    for(stare=0;stare<=smax;stare++){
        for(i=0;i<k;i++){
            if((stare&(1<<i))){
                for(j=0;j<k;j++){
                   if(!(stare&(1<<j))){
                        dp[stare|(1<<j)][j]=min(dp[stare|(1<<j)][j],dp[stare][i]+cost[i][j]);
                   }
                }
            }
        }
    }
    for(i=1;i<=n;i++){
        dis[i]=INF;
    }
    dis[n]=0;
    Djakstra(n);
    int sol=INF;
    for(i=0;i<k;i++){
        sol=min(sol,dp[mx-1][i]+dis[spec[i]]);
    }
    if(k==0){
        sol=dis[1];
    }
    cou<<sol;

}

int main()
{
    citire();
    rez();
    return 0;
}