Pagini recente » Cod sursa (job #533881) | Cod sursa (job #2598204) | Cod sursa (job #1041499) | Cod sursa (job #2600093) | Cod sursa (job #680301)
Cod sursa(job #680301)
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX_N 2001
#define INF 999999
int n,m,k,d[MAX_N][MAX_N];
vector<int> prieteni;
void init(void)
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
d[i][j]=INF;
for(i=0; i<n; i++)
d[i][i]=0;
}
void read(void)
{
int i,x,y,c;
freopen("ubuntzei.in","r",stdin);
scanf("%d %d %d",&n,&m,&k);
for(i=1; i<=k; i++)
{
scanf("%d ",&x);
x--;
prieteni.push_back(x);
}
init();
for(i=1; i<=m; i++)
{
scanf("%d %d %d",&x,&y,&c);
x--; y--;
d[x][y]=c; d[y][x]=c;
}
}
void roy_floyd(void)
{
int k,i,j;
for(k=0; k<n; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
}
int solve(void)
{
if(k>0)
{
int i,start=0,final=n-1,temp,answer=INF;
sort(prieteni.begin(),prieteni.end());
do
{
temp=d[start][prieteni.front()]+d[prieteni.back()][final];
for(i=0; i<k-1; i++)
temp+=d[prieteni[i]][prieteni[i+1]];
answer=min(temp,answer);
}while(next_permutation(prieteni.begin(),prieteni.end()));
return answer;
}
else
return d[0][n-1];
}
void write(void)
{
freopen("ubuntzei.out","w",stdout);
printf("%d ",solve());
}
int main()
{
read();
roy_floyd();
write();
return 0;
}