Cod sursa(job #1121645)

Utilizator thesvcoolmanLucian Bicsi thesvcoolman Data 25 februarie 2014 13:31:44
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<algorithm>
#define INF 99999999
#define N 2001
#define K 16
using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

long long n,m,k,a[N][N],oras[K],luat[K];

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

int cmin=INF;

void verifica()
{
    int i,cost=0;
    for(i=1;i<=k+1;i++)
        cost+=a[oras[i]][oras[i-1]];
    cmin=min(cmin,cost);
}

/*void gen(int p)
{
    if(p>k)
        verifica();
    else
    for(int i=1;i<=k;i++)
        if(!luat[i])
        {
            sol[p]=i;
            luat[i]=1;
            gen(p+1);
            luat[i]=0;
        }
}*/


int main()
{
    fin>>n>>m;
    int i,j,x,y,c;
    for(i=1;i<n;i++)
        for(j=i+1;j<=n;j++)
            a[i][j]=a[j][i]=INF;

    fin>>k;
    for(i=1;i<=k;i++)
        fin>>oras[i];

    for(i=1;i<=m;i++)
        {fin>>x>>y>>c;
        a[x][y]=a[y][x]=c;}

    royfloyd();
    oras[0]=1;
    oras[k+1]=n;
    sort(oras+1,oras+k+1);
    verifica();
    while(next_permutation(oras+1,oras+k+1))
        verifica();

    fout<<cmin;
    return 0;
}