Pagini recente » Cod sursa (job #2250198) | Cod sursa (job #1548941) | Cod sursa (job #2376744) | Cod sursa (job #682233) | Cod sursa (job #1104113)
#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;
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))
{
distTot+=cost[st[k-1]][st[k]];
if(k==loc)
{
if(drumMin>distTot)
{
drumMin=distTot+cost[st[k]][noduri];
distTot=drumMin;
}
}
else
back(k+1);
}
}
}
bool valid(int k)
{
for(int i=1; i<k; ++i)
if(st[i]==st[k])
return false;
return true;
}