Cod sursa(job #3200392)

Utilizator radu._.21Radu Pelea radu._.21 Data 4 februarie 2024 15:16:15
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>

using namespace std;
#define INF 1000000000
int c[2001][2001];
int min0=INF;
int k,m,n,sol[101],v[101],f[2001];
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
void verif(){
    int nod = 1;
    int S = 0;
    for(int i=1;i<=k;i++){
        S+=c[nod][sol[i]];
        nod=sol[i];
    }
    S+=c[nod][n];
    //for(int i=1;i<=k;i++)
        //cout<<sol[i]<<" ";
    min0=min(min0,S);
}
void back(int poz){
    if(poz==k+1)
        verif();
    else{
        for(int i=1;i<=k;i++)
            if(f[v[i]]==0){
                f[v[i]]=1;
                sol[poz]=v[i];
                back(poz+1);
                f[v[i]]=0;
        }
    }
}
int main(){
    fin>>n>>m;
    fin>>k;
    for(int i=1;i<=k;i++)
        fin>>v[i];
     for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++)
        c[i][j]=INF;
    c[i][i]=0;
    }
    while(m--){
        int i,j,cost;
        fin>>i>>j>>cost;
        c[i][j]=cost;
        c[j][i]=cost;
    }
    //for(int i=1;i<=n;i++)
       // c[i][i]=0;
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(c[i][j]>c[i][k]+c[k][j])
                    c[i][j]=c[i][k]+c[k][j];
   // for(int i=1;i<=n;i++)
   //     c[i][i]=0;

    back(1);
    fout<<min0;
    return 0;
}