Cod sursa(job #1080727)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 12 ianuarie 2014 20:26:53
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define Nmax 1500
#define Mmax 10099
#define Kmax 20
#define Inf 999999999
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

short N,M,K,Ubuntzei[Kmax];
long long C[Nmax][Nmax],sol;
vector < short > st;

inline void ReadInput()
{
    f>>N>>M>>K;
    for(int i=1;i<=K;++i)f>>Ubuntzei[i];
    for(int i=1;i<=N;++i)
        for(int j=1;j<=N;++j)C[i][j]=Inf;
    for(int i=1;i<=M;++i)
    {
        int x,y,cost;
        f>>x>>y>>cost;
        C[x][y]=C[y][x]=cost;
    }
}

void RoyFloyd()
{
    for(int i=1;i<=N;++i)C[i][i]=0;
    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][k] && C[k][j]&&(C[i][j]==Inf || 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]<<' ';
}

int main()
{
    ReadInput();
    RoyFloyd();
    if(!K)
    {
        g<<C[1][N]<<'\n';
        return 0;
    }
    if(K==1)
    {
        g<<C[1][Ubuntzei[1]]+C[Ubuntzei[1]][N]<<'\n';
        return 0;
    }
    for(int i=1;i<=K;++i)st.push_back(i);
    sol=Inf;
    do
    {
        long long S=C[1][Ubuntzei[st[0]]]+C[Ubuntzei[st[K-1]]][N];
        for(int i=0;i<K-1;++i)S+=C[Ubuntzei[st[i]]][Ubuntzei[st[i+1]]];
        if(S<sol)sol=S;
        //for(int i=1;i<=K;++i)g<<st[i]<<' '; g<<'\n';

    }while(next_permutation(st.begin(),st.end()));
    g<<sol<<'\n';
    g<<sizeof(C)/1000000.0<<'\n';
    f.close();g.close();
    return 0;
}