Cod sursa(job #1662731)

Utilizator aldea_caldea c. aldea_c Data 24 martie 2016 23:56:03
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
using namespace std;
int a[2000][2000];
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,c[16],v[16],viz[16],mini=100001;

void citire()
{
    int i,x,y,cst;
    f>>n>>m;
    f>>k;
    for(i=1; i<=k; i++)
        f>>c[i];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            a[i][j]=mini;
            if(i==j)a[i][j]=0;
        }
    for(i=1; i<=m; i++)
    {
        f>>x>>y>>cst;
        a[x][y]=a[y][x]=cst;
    }

}
void roy_floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(a[i][k]+a[k][j]<a[i][j])
                    a[i][j]=a[i][k]+a[k][j];

}
void calcul()
{
    int sum;
    sum=a[1][c[v[1]]]+a[c[v[k]]][n];
    for(int i=1; i<k; i++)
    {
        sum=sum+a[c[v[i]]][c[v[i+1]]];
    }
    if (sum<mini)
    {
        mini=sum;
    }
}

void permutari(int p)
{
    if(p==k+1)
        calcul();
    else for(int i=1; i<=k; i++)
        {
            if(viz[i]==0)
            {
                v[p]=i;
                viz[i]=1;
                permutari(p+1);
                viz[i]=0;
            }
        }
}
int main()
{
    citire();
    roy_floyd();
    if(k==0)g<<a[1][n];
    else if(k==1)g<<a[1][c[1]]+a[c[1]][n];
    else
    {
        permutari(1);
        g<<mini;
    }
    f.close();
    g.close();
    return 0;
}