Pagini recente » Cod sursa (job #2480574) | Cod sursa (job #789536) | Cod sursa (job #2090579) | Cod sursa (job #2767983) | Cod sursa (job #1806799)
#include <iostream>
#include <fstream>
#define MAX 1000000000
using namespace std;
ifstream f_in("ubuntzei.in");
ofstream f_out("ubuntzei.out");
int N,M,k,C[2002],a[2001][2001],p[2001],s[2001],d_max=MAX,stiva[20];
long long d[2001][2001];
void init(){
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
a[i][j]=MAX;
}
void citire(){
int drum,x,y;
for(int i=1;i<=k;i++)
{f_in>>C[i];}
for(int i=1; i<=M; i++)
{
f_in>>x>>y>>drum;
if((a[x][y]==MAX || drum < a[x][y]) && x!=y){
a[x][y]=a[y][x]=drum;}
}
f_in.close();
}
void dijkstra(int x){ int i,j; long long min,y; s[x]=1;
for(i=1;i<=N;i++)
{ d[x][i]=a[x][i];
if(i!=x && d[x][i]<MAX) p[i]=x;}
for(i=1;i<=N-1;i++)
{ for(j=1,min=MAX;j<=N;j++)
if(s[j]==0 && d[x][j]<min) { min=d[x][j];y=j;}
s[y]=1;
for(j=1;j<=N;j++)
{if(s[j]==0 && d[x][j]>d[x][y]+a[y][j]) {d[x][j]=d[x][y]+a[y][j]; p[j]=y;}
d[j][x]=d[x][j];}
}
}
void actualizare(){
for(int i=1;i<=N;i++)
{s[i]=0;p[i]=0;}
}
int valid(int temp){
for(int i=1;i<temp;i++)
if(stiva[i]==stiva[temp])
return 0;
return 1;
}
int solutie(int temp){return temp==k;}
void tipar(){
int drum=0;
for(int i=0;i<=k;i++)
drum+=d[stiva[i]][stiva[i+1]];
if(drum<d_max)
d_max=drum;
}
void bk(int temp){
for(int i=1;i<=k;i++){
stiva[temp]=C[i];
if(valid(temp))
if(solutie(temp)) tipar();
else bk(temp+1);
}
}
int main()
{
f_in>>N;
f_in>>M;
f_in>>k;
init();
citire();
if(k==0){dijkstra(1); f_out<<d[1][N];}
else{
for(int i=1;i<=k;i++)
{dijkstra(C[i]);
actualizare();}
stiva[0]=1;
stiva[k+1]=N;
bk(1);
f_out<<d_max;
}
return 0;
}