Cod sursa(job #1126905)

Utilizator roitainNiculae Cristian roitain Data 27 februarie 2014 10:22:49
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
//Floyd Warshall
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("ubuntzei.in");
ofstream o("ubuntzei.out");
const int inf=99999999;
int n,m,pr[17],r,i,j,v[2000][2000],t,minim,minimi,b[20];
void init(int k){
    b[k]=-1;
}
bool verificare(int k){
    if(b[k]<r-1){
        b[k]++;
        return true;
    }
    return false;
}
bool valid(int k){
    for(int i=0;i<k;i++)
        if(b[i]==b[k])
            return false;
    return true;
}
bool solutie(int k){
    return k==r-1;
}
void back(){
    int k=0;
    init(k);
    while(k>=0){
        if(verificare(k)){
            if(valid(k))
                if(solutie(k)){
                    minimi=v[1][pr[b[0]]];
                    for(int i=1;i<r;i++){
                        minimi+=v[pr[b[i-1]]][pr[b[i]]];
                    }
                    minimi+=v[pr[b[k]]][n];
                    if(minimi<minim)
                        minim=minimi;
                }else k++;
        }else k--;
    }
}
void citire(){
    int x,y,l;
    f>>n>>m;
    f>>r;
    for(i=0;i<r;i++)
        f>>pr[i];
    for(i=0;i<m;i++){
        f>>x>>y>>l;
        v[x][y]=l;
        v[y][x]=l;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j&&v[i][j]==0)
                v[i][j]=inf;
}
int main(){
    citire();
    for(t=1;t<=n;t++)
        for(i=1;i<=n;i++)
            if(i!=t)
                for(j=1;j<=n;j++)
                    if(j!=t)
                        if(v[t][j]!=inf&&v[i][t]!=inf&&v[i][t]+v[t][j]<v[i][j])
                            v[i][j]=v[i][t]+v[t][j];
    if(!r)
        o<<v[1][n];
    else{
        minim=inf;
        back();
        o<<minim;
    }
    return 0;
}