Pagini recente » Cod sursa (job #2057749) | Cod sursa (job #690060) | Cod sursa (job #2740951) | Cod sursa (job #1279578) | Cod sursa (job #1104943)
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
FILE *in, *out;
//definitii
#define pb push_back
//constante
const int Nmax = 2005;
const int oo = 0x3f3f3f3f;
//variabile
int noduri, muchii, loc, x;
vector<int> localitati;
int nod1, nod2, dist;
int cost[Nmax][Nmax];
int distTot, drumMin;
int main(void)
{
in = fopen("ubuntzei.in","rt");
fscanf(in,"%d%d%d",&noduri, &muchii, &loc);
for(int i = 0; i<loc; ++i)
{
fscanf(in, "%d", &x);
localitati.pb(x);
}
memset(cost, oo, sizeof(cost));
for(int i=1; i<=noduri; ++i)
cost[i][i] = 0;
while(muchii--)
{
fscanf(in, "%d%d%d", &nod1, &nod2, &dist);
cost[nod1][nod2] = cost[nod2][nod1] = dist;
}
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]);
}
out = fopen("ubuntzei.out","wt");
if(loc > 0)
{
sort(localitati.begin(),localitati.end());
drumMin = oo;
do
{
int destTot = cost[1][localitati[0]] + cost[localitati[loc-1]][noduri];
//vector<int> :: iterator it, end = localitati.end()-1;
//for(it = localitati.begin(); it!=end; ++it)
int limit = loc-1;
for(int i=0 ; i<limit ; ++i)
destTot += cost[localitati[i]][localitati[i+1]];
drumMin = min(drumMin, destTot);
}
while(next_permutation(localitati.begin(),localitati.end()));
}
else
while(1);
fprintf(out,"%d",drumMin);
fclose(out);
return 0;
}