Pagini recente » Cod sursa (job #1916768) | Cod sursa (job #2224580) | Cod sursa (job #2077206) | Cod sursa (job #2766321) | Cod sursa (job #1104220)
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
FILE *in,*out;
//definiti
//functii
void back(int k);
bool valid(int k);
//constante
const int Nmax=(int) 2e3+1;
const int oo=(1<<30)-1;
//variabile
int noduri,muchii,loc;
int localitati[Nmax-2];
int nod1,nod2,dist;
int cost[Nmax][Nmax];
int st[Nmax-2],distTot,drumMin;
int main(void)
{
in=fopen("ubuntzei.in","rt");
fscanf(in,"%d%d%d",&noduri,&muchii,&loc);
for(int i=1; i<=loc; ++i)
fscanf(in,"%d",&localitati[i]);
memset(cost , 0x3f , sizeof(cost));
while(muchii--)
{
fscanf(in,"%d%d%d",&nod1,&nod2,&dist);
cost[nod1][nod2]=cost[nod2][nod1]=dist;
}
for(int i=1; i<=noduri; ++i)
cost[i][i]=0;
fclose(in);
for(int h=1; h<=noduri; ++h)
for(int i=1; i<=noduri; ++i)
{
if(i==h)
continue;
for(int j=1; j<=noduri; ++j)
cost[i][j]=min(cost[i][j],cost[i][h]+cost[h][j]);
}
drumMin=oo;
sort(localitati,localitati+loc);
st[0]=1;
st[loc+1]=noduri;
back(1);
out=fopen("ubuntzei.out","wt");
fprintf(out,"%d",drumMin);
fclose(out);
return 0;
}
void back(int k)
{
for(int i=1; i<=loc; ++i)
{
st[k]=localitati[i];
if(valid(k))
{
if(k==loc)
{
for(int j=0; j<=loc; ++j)
distTot+=cost[st[j]][st[j+1]];
if(distTot<drumMin)
drumMin=distTot;
distTot=0;
}
else
back(k+1);
}
}
}
bool valid(int k)
{
for(int i=1; i<k; ++i)
if(st[i]==st[k])
return false;
return true;
}