Pagini recente » Cod sursa (job #1106791) | Cod sursa (job #1622933) | Cod sursa (job #1514419) | Cod sursa (job #2552236) | Cod sursa (job #581179)
Cod sursa(job #581179)
#include<stdio.h>
#include<vector>
#define INF 10000
int A[2001][2001];
int N;
int M;
int K;
int V[16];
short int viz[16];
int Oras[16];
int MIN = 100000;
void initializare(void)
{
for(int i=1;i<=N;i++)
memset(A[i],INF,sizeof(A[0]));
}
void citire(void)
{
int a;
int b;
int c;
FILE *f = fopen("ubuntzei.in","r");
fscanf(f,"%d %d",&N,&M);
initializare();
fscanf(f,"%d ",&K);
for(int i=1;i<=K;i++)
{
fscanf(f,"%d ",&a);
Oras[i] = a;
}
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d %d",&a,&b,&c);
A[a][b] = c;
A[b][a] = c;
}
fclose(f);
}
void royfloyd(void)
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
if(A[i][j]>A[i][k]+A[k][j])
A[i][j] = A[i][k] + A[k][j];
}
void calcmax(void)
{
long long sum = A[1][Oras[V[1]]] + A[N][Oras[V[K]]];
for(int i=1;i<K;i++)
sum += A[Oras[V[i]]][Oras[V[i+1]]];
if(MIN>sum)
MIN = sum;
}
void back(int k)
{
if(k == K+1)
calcmax();
else
{
for(int i=1;i<=K;i++)
if(!viz[i])
{
V[k] = i;
viz[i] = 1;
back(k+1);
viz[i] = 0;
}
}
}
void calc(void)
{
FILE *f = fopen("ubuntzei.out","w");
if(!K)
fprintf(f,"%d ",A[1][N]);
else
{
back(1);
fprintf(f,"%d ",MIN);
}
fclose(f);
}
int main()
{
citire();
royfloyd();
calc();
return 0;
}