Pagini recente » Istoria paginii runda/clasele_5_6/clasament | Cod sursa (job #386312) | cum_sa_fii_manelist | Cod sursa (job #1756564) | Cod sursa (job #791840)
Cod sursa(job #791840)
#include<cstdio>
#include<vector>
using namespace std;
int pl,p,mini,x1,y1,c1,ul,i,j,k,n,m,v[20],c[2003][2003],d[20][20],ap[2003],b[2003],a[1<<15][17];
int min(int a,int b)
{
if(a<b) return a;
return b;
}
vector < int > h[1<<15];
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
scanf("%d",&k);
for(i=1;i<=k;i++)
scanf("%d",&v[i]);
for(i=1;i<=m;i++)
{
scanf("%d",&x1);
scanf("%d",&y1);
scanf("%d",&c1);
c[x1][y1]=c1;
c[y1][x1]=c1;
}
v[0]=1;
for(i=0;i<=k;i++)
{
ul=v[i];
for(j=1;j<=n;j++)
{
b[j]=-1;
ap[j]=0;
}
b[ul]=0;
ap[ul]=1;
while(1)
{
for(j=1;j<=n;j++)
if(c[ul][j]!=0&&(b[ul]+c[ul][j]<b[j]||b[j]==-1))
b[j]=b[ul]+c[ul][j];
mini=999999;
for(j=1;j<=n;j++)
if(b[j]<mini&&ap[j]==0&&b[j]!=-1)
{
mini=b[j];
ul=j;
}
if(mini==999999) break;
ap[ul]=1;
}
for(j=1;j<=k;j++)
d[i][j]=b[v[j]];
d[i][k+1]=b[n];
}
if(k==0)
{
printf("%d\n",d[0][1]);
return 0;
}
/*for(i=0;i<=k;i++)
{
for(j=1;j<=k+1;j++)
printf("%d ",d[i][j]);
printf("\n");
}*/
//a[i][j]=configuratia i, ultima j
for(i=1;i<(1<<k);i++)
for(j=0;j<k;j++)
if(i&(1<<j))
{
a[i][j+1]=99999999;
h[i].push_back(j);
}
for(i=1;i<(1<<k);i++)
{
//for(j=0;j<k;j++)
//if(i&(1<<j))
for(pl=0;pl<h[i].size();pl++)
{
j=h[i][pl];
if((i&(i-1))==0&&d[0][j+1]!=-1) a[i][j+1]=d[0][j+1];
for(p=1;p<=k;p++)
if((i&(1<<(p-1)))==0&&p!=j+1&&d[j+1][p]!=-1) a[i+(1<<(p-1))][p]=min(a[i+(1<<(p-1))][p],a[i][j+1]+d[j+1][p]);
}
}
mini=99999999;
for(j=1;j<=k;j++)
if(a[(1<<k)-1][j]+d[j][k+1]>0&&d[j][k+1]!=-1&&a[(1<<k)-1][j]+d[j][k+1]<mini)
mini=a[(1<<k)-1][j]+d[j][k+1];
printf("%d\n",mini);
return 0;
}