Cod sursa(job #1647422)

Utilizator SmitOanea Smit Andrei Smit Data 10 martie 2016 20:30:52
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
#define INF 1000000000

using namespace std;

int n,m,K,a[2003][2003],st[20],v[20],sol,t[20];

inline void Citire()
{
    int i,j,x,y,z;
    ifstream fin("ubuntzei.in");
    fin>>n>>m;
    fin>>K;
    for(i=1;i<=K;++i)
        fin>>t[i];
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            if(i!=j)
                a[i][j]=INF;
    for(i=1;i<=m;++i)
    {
        fin>>x>>y>>z;
        if(x!=y)
            a[x][y]=a[y][x]=z;
    }
    fin.close();
}

inline void Dinamica()
{
    int i,j,k;
    for(k=1;k<=n;++k)
        for(i=1;i<=n;++i)
            for(j=1;j<=n;++j)
                a[i][j]=min(a[i][j],a[i][k] + a[k][j]);
}

inline void Calculeaza()
{
    int i,s,x,ant;
    s=0;
    ant=1;
    for(i=1;i<=K;++i)
    {
        x=t[st[i]];
        s+=a[ant][x];
        ant=x;
    }
    s+=a[ant][n];
    sol=min(sol,s);
}

inline void Back(int k)
{
    int i;
    if(k==K+1)
        Calculeaza();
    else
    for(i=1;i<=K;++i)
        if(v[i]==0)
        {
            st[k]=i;
            v[i]=1;
            Back(k+1);
            v[i]=0;
        }
}

int main()
{
    Citire();
    Dinamica();
    sol=INF;
    Back(1);
    ofstream fout("ubuntzei.out");
    fout<<sol<<"\n";
    fout.close();
    return 0;
}