Pagini recente » Cod sursa (job #3262797) | Cod sursa (job #1451213) | Cod sursa (job #849512) | Cod sursa (job #205537) | Cod sursa (job #3309345)
#include <fstream>
#include <algorithm>
#include <vector>
#define MAX_N 2001
#define INF 999999
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int n,m,k,d[MAX_N][MAX_N];
vector<int> prieteni;
void init(void) {
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
d[i][j]=INF;
}
}
for (int i=0; i<n; i++) {
d[i][i]=0;
}
}
void f(void) {
for (int k=0; k<n; k++) {
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
}
}
}
}
int solve(void) {
if (k>0) {
int start=0,final=n-1,temp,answer=INF;
sort(prieteni.begin(),prieteni.end());
do {
temp=d[start][prieteni.front()]+d[prieteni.back()][final];
for (int i=0; i<k-1; i++) {
temp+=d[prieteni[i]][prieteni[i+1]];
}
answer=min(temp,answer);
}while(next_permutation(prieteni.begin(),prieteni.end()));
return answer;
}
else return d[0][n-1];
}
int main() {
int x,y,c;
cin>>n>>m>>k;
for (int i=1; i<=k; i++) {
cin>>x;
x--;
prieteni.push_back(x);
}
init();
for (int i=1; i<=m; i++) {
cin>>x>>y>>c;
x--;
y--;
d[x][y]=c;
d[y][x]=c;
}
f();
cout<<solve();
}