Cod sursa(job #2172475)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 15 martie 2018 16:39:47
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
bool viz[20];
long long n,m,k,c[20],i,x,y,cst,a[2011][2011],st[20],mn=1e17,ans,dp[2011][32000],s,j;
void prelucreaza()
{
    ans=a[1][c[st[1]]]+a[c[st[k]]][n];
    for(int i=1;i<k;i++)
    {
        ans+=a[c[st[i]]][c[st[i+1]]];
    }
    mn=min(mn,ans);
}
void perm(int p)
{
    for(int i=1;i<=k;i++)
        if(!viz[i])
    {
        st[p]=i;
        viz[i]=1;
        if(p<k)
        {
            perm(p+1);

        }
        else
            prelucreaza();
        viz[i]=0;
    }
}
void royfloyd()
{
    int i,j,k;
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                if ( a[i][k] && a[k][j] && (a[i][j] > a[i][k] + a[k][j] || !a[i][j]) && i!=j )
                    a[i][j]=a[i][k]+a[k][j];
}
int main()
{
    f>>n>>m>>k;
    for(i=1;i<=k;i++)
        f>>c[i];
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>cst;
        a[x][y]=a[y][x]=cst;
    }
    royfloyd();
    //perm(1);
    //g<<mn;
    for(i=1;i<=n;i++)
        for(s=1;s<=(1<<k);s++)
        dp[i][s]=1e17;
    for(i=1;i<=n;i++)
    {
        dp[i][0]=a[1][i];
        dp[i][1<<i]=a[1][i];
    }
    for(s=0;s<=(1<<k);s++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(a[i][j] && j!=i)
    {
        if(s>=(1<<j) && dp[j][s]>dp[i][s-(1<<j)]+a[j][i])
        dp[j][s]=dp[i][s-(1<<j)]+a[j][i];
    }
    int sum=0;
    for(i=1;i<=k;i++)
        sum+=(1<<c[i]);
    for(i=sum;i<=(1<<n);i++)
        mn=min(mn,dp[n][i]);
    g<<mn;
}