Pagini recente » Cod sursa (job #2656480) | Cod sursa (job #525486) | Cod sursa (job #1400795) | Cod sursa (job #345587) | Cod sursa (job #695286)
Cod sursa(job #695286)
#include<cstdio>
#include<iostream>
#define INT_MAX 99999
using namespace std;
FILE *fin=fopen("ubuntzei.in","r");
FILE *fout=fopen("ubuntzei.out","w");
int n,m,k,K[16],i,j,ct,cmin=INT_MAX;
int cost[2001][2001],distante[16][2001];
int x[17];
int dist[1001],viz[1001],tata[1001];
int test(int k)
{
for(int i=1;i<k;i++)
if(x[i]==x[k]) return 0;
return 1;
}
int bk(int k1)
{
x[k1]=0;
while(x[k1]<k)
{
x[k1]++;
if(test(k1)){
if(k1>1)ct+=distante[x[k1-1]][K[x[k1]]];
if(k1==k) {
/* for(int i=1;i<=k;i++)
fprintf(fout,"%d ",K[x[i]]);
fprintf(fout,"\n%d\n\n",ct);*/
cmin=min(cmin,ct+distante[0][K[x[1]]]+distante[x[k]][n]);
}
else bk(k1+1);
if(k1>1)ct-=distante[x[k1-1]][K[x[k1]]];
}
}
}
int minim()
{
int cmin=INT_MAX;int poz;
for(int i=1;i<=n;i++)
if(dist[i]<cmin && viz[i]==0){cmin=dist[i];poz=i;}
return poz;
}
void dijkstra(int start)
{
int i,j;
for(i=1;i<=n;i++) viz[i]=0;
viz[start]=1;
for(i=1;i<=n;i++)
{
dist[i]=cost[start][i];
}
for(i=1;i<n;i++)
{
int x=minim();
viz[x]=1;
for(j=1;j<=n;j++)
if(dist[j]>dist[x]+cost[x][j] && cost[x][j]!=INT_MAX)
{
dist[j]=dist[x]+cost[x][j];
}
}
}
int main()
{
fscanf(fin,"%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
fscanf(fin,"%d",&K[i]);
for(i=1;i<=m;i++)
{
int x1,y1,ct;
fscanf(fin,"%d%d%d",&x1,&y1,&ct);
cost[x1][y1]=cost[y1][x1]=ct;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(cost[i][j]==0 && i!=j) cost[i][j]=INT_MAX;
dijkstra(1);
for(i=1;i<=n;i++)
distante[0][i]=dist[i];
for(i=1;i<=k;i++)
{
dijkstra(K[i]);
for(int j=1;j<=n;j++)
distante[i][j]=dist[j];
}
/* for(i=0;i<=k;i++)
{
fprintf(fout,"\n");
for(j=1;j<=n;j++)
fprintf(fout,"%d ",distante[i][j]);
}*/
if(k!=0){
bk(1);
fprintf(fout,"%d",cmin);}
else fprintf(fout,"%d",cost[1][n]);
}