Pagini recente » Cod sursa (job #2652918) | Cod sursa (job #1994665) | Cod sursa (job #1223387) | Cod sursa (job #929557) | Cod sursa (job #1082084)
#include <fstream>
#include <algorithm>
#include <vector>
#define Nmax 210
#define Mmax 10099
#define Kmax 20
#define Inf 2000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
short N,M,K;
int C[Nmax][Nmax],sol;
vector < short > st;
inline void ReadInput()
{
f>>N>>M>>K;
for(int i=1;i<=K;++i)
{
int Ubuntzel;
f>>Ubuntzel;
st.push_back(Ubuntzel);
}
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,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][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;
}
sort(st.begin(),st.end());
sol=Inf;
do
{
long long S=C[1][st[0]]+C[st[K-1]][N];
for(int i=0;i<K-1;++i)S+=C[st[i]][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;
}