Cod sursa(job #2003816)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 23 iulie 2017 23:41:13
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <climits>
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int n,suma,sol=INT_MAX,k,perm[23],v[2003][2003],viz[23],m,go[23],a,b,c;
void solve(int nr)
{
    if(nr==k+1)
    {
        suma=v[1][go[perm[1]]];
        for(int i=2;i<=k;++i) suma+=v[go[perm[i-1]]][go[perm[i]]];
        suma+=v[go[perm[k]]][n];
        if(suma<sol) sol=suma;
        return;
    }
    for(int i=1;i<=k;++i)
    {
        if(viz[i]==false)
        {
            viz[i]=true;
            perm[nr]=i;
            solve(nr+1);
            viz[i]=false;
        }
    }
}
int main()
{
    f>>n>>m>>k;
    for(int i=1;i<=k;++i) f>>go[i];
    for(int i=1;i<=m;++i)
    {
        f>>a>>b>>c;
        v[a][b]=v[b][a]=c;
    }
    for(int k=1;k<=n;++k)
    {
        for(int i=1;i<=n;++i)
        {
            for(int  j=1;j<=n;++j)
            {
                if(v[i][k]&&v[k][j]&&i!=j&&j!=k&&k!=i&&(!v[i][j]||v[i][k]+v[k][j]<v[i][j])) v[i][j]=v[i][k]+v[k][j];
            }
        }
    }
    if(k>=2) solve(1);
    else if(k==1)
    {
        sol=v[1][go[1]]+v[go[1]][n];
    }
    else if(k==0) sol=v[1][n];
    g<<sol;
    return 0;
}