Cod sursa(job #1082119)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 14 ianuarie 2014 10:38:35
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <algorithm>
#define Nmax 210
#define Mmax 10099
#define Kmax 20
#define Inf 20000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int N,M,K,sol,C[Nmax][Nmax],U[Kmax];

int main()
{
    f>>N>>M>>K;
    for(int i=1;i<=K;++i)f>>U[i];
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j)
            if(i!=j)C[i][j]=Inf;

    for(int i=1;i<=M;++i)
    {
        int x,y,c;
        f>>x>>y>>c;
        C[x][y]=C[y][x]=c;
    }



    for(int k=1;k<=N;++k)
        for(int i=1;i<=N;++i)
            for(int j=1;j<=N;++j)
                if(i!=j && (C[i][j]>C[i][k]+C[k][j]))
                C[i][j]=C[i][k]+C[k][j];

    //for(int i=1;i<=N;++i,g<<'\n')
            //for(int j=1;j<=N;++j)g<<C[i][j]<<' ';
    if(!K)
    {
        g<<C[1][N]<<'\n';
        return 0;
    }
    sort(U+1,U+1+K);
    sol=Inf;
    do
    {
        int cost=C[1][U[1]]+C[U[K]][N];
        for(int i=1;i<K;++i)cost+=C[U[i]][U[i+1]];
        if(cost<sol)sol=cost;

    }while (next_permutation(U+1,U+1+K));
    g<<sol<<'\n';

    f.close();g.close();
    return 0;
}