Cod sursa(job #2653187)

Utilizator eugen5092eugen barbulescu eugen5092 Data 27 septembrie 2020 12:26:51
Problema Ubuntzei Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
#define inf 1000000000
using namespace std;

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

int n,m,k,fin=inf;
int c[20005];
vector<int>v[20005];

int dis[20005][20005];

int sol[200];
int vis[200];

void cit(){
    ci>>n>>m>>k;
    int a,b,g;

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            dis[i][j]=inf;
            if(i==j){
                dis[i][j]=0;
            }
        }
    }

    for(int i=1;i<=k;i++){
        ci>>c[i];
    }
    for(int i=1;i<=m;i++){
        ci>>a>>b>>g;
        if(a>b){
            swap(a,b);
        }
        dis[a][b]=g;
        dis[b][a]=g;
        //dis[b][a]=c;
    }

}



void rez(){
    int j,i,p,x,y;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            for(p=1;p<=n;p++){
                //cout<<i<<" "<<p<<" "<<j<<"\n";
                //cout<<dis[i][p]<<" "<<dis[p][j]<<" "<<dis[i][j]<<"\n\n";
                if(dis[i][p]+dis[p][j]<dis[i][j]){
                    dis[i][j]=dis[i][p]+dis[p][j];
                }
            }
        }
    }
}

void afis(){
    int distanta=0;
    distanta+=dis[1][sol[1]];

    for(int i=2;i<=k;i++){
        //cout<<sol[i]<<" ";
        distanta+=dis[sol[i-1]][sol[i]];
    }
    distanta+=dis[sol[k]][n];

    fin=min(fin,distanta);

}

void Back(int p){
    if(p==k+1){
        afis();
    }else{
        for(int i=1;i<=k;i++){
            while(vis[i]==1){
                i++;
            }
            if(i>k){
                return;
            }

            vis[i]=1;
            sol[p]=c[i];
            Back(p+1);
            vis[i]=0;

        }
    }
}

int main()
{
    cit();
    rez();
    Back(1);
    cou<<fin;
    return 0;
}