Pagini recente » Cod sursa (job #1637114) | Cod sursa (job #1624532) | Cod sursa (job #2687319) | Cod sursa (job #385517) | Cod sursa (job #2289985)
#include <fstream>
#include <vector>
using namespace std;
struct drum{
int y, l;
};
int N, M, K, C[17], D[17][17], Dm=1e9;
int dist[2001];
bool Viz[2001];
vector<drum> L[2001];
void Dijk(int q, int r){
int i, j, k;
for (i=1; i<=N; i++){
dist[i]=1e9;
Viz[i]=false;
}
dist[r]=0;
dist[0]=1e9;
for (i=1; i<=N; i++){
k=0;
for (j=1; j<=N; j++)
if (Viz[j]==false && dist[j]<dist[k])
k=j;
Viz[k]=true;
for (j=0; j<L[k].size(); j++)
if (Viz[L[k][j].y]==false && dist[L[k][j].y]>dist[k]+L[k][j].l)
dist[L[k][j].y]=dist[k]+L[k][j].l;
}
for (i=0; i<=K+1; i++)
D[q][i]=dist[C[i]];
}
void Genereaza(int k, int l, int p){
if (k==K+1){
Dm=min(Dm, l+D[p][K+1]);
return;
}
for (int i=1; i<=K; i++)
if (Viz[i]==false && l+D[p][i]<Dm){
Viz[i]=true;
Genereaza(k+1, l+D[p][i], i);
Viz[i]=false;
}
}
int main(){
int i, a, b, c;
ifstream fin ("ubuntzei.in");
fin >> N >> M >> K;
C[0]=1;
for (i=1; i<=K; i++)
fin >> C[i];
C[K+1]=N;
for (i=0; i<M; i++){
fin >> a >> b >> c;
L[a].push_back({b, c});
L[b].push_back({a, c});
}
fin.close();
for (i=0; i<=K+1; i++)
Dijk(i, C[i]);
for (i=1; i<=K; i++)
Viz[i]=false;
Genereaza(1, 0, 0);
ofstream fout ("ubuntzei.out");
fout << Dm;
fout.close();
return 0;
}