Pagini recente » Cod sursa (job #1622486) | Cod sursa (job #2370797) | Cod sursa (job #2241193) | Cod sursa (job #470219) | Cod sursa (job #1227582)
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct sp
{
int no,co;
const bool operator <(const sp & other)
const {
return co>other.co;
}
};
const int SOLM=400000000;
vector<sp> li[2005],ili[2005];
int p2[20],sec[30],dist[30][30],k,dtm[2005],po[2005],din[16][1<<16];
bool be[2005];
priority_queue <sp> pq;
void djk(int nod)
{
int i;
sp tmp,tm2;
tmp.no=nod;
tmp.co=0;
pq.push(tmp);
while(!pq.empty())
{
tmp=pq.top();
pq.pop();
if(be[tmp.no]==0)
{
be[tmp.no]=1;
for(i=li[tmp.no].size()-1;i>=0;i--)
{
tm2.no=li[tmp.no][i].no;
tm2.co=tmp.co+li[tmp.no][i].co;
if(be[tm2.no]==0 || dtm[tm2.no]>tm2.co)
{
dtm[tm2.no]=tm2.co;
pq.push(tm2);
}
}
}
}
}
int fct(int nod,int bm)
{
int i,sol,x;
if(bm==p2[nod])
{
din[nod][bm]=dist[k-1][nod];
}
if(din[nod][bm]>0)
return din[nod][bm];
for(i=16;i>0;i--)
if((bm & p2[i]) && dist[i][nod]>0)
{
x=bm-p2[nod];
fct(i,x);
if(din[i][x]>0 && dist[i][nod]>0)
sol=min(sol,din[i][x]+dist[i][nod]);
}
din[nod][bm]=sol;
return sol;
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int n,m,i,j,bm,sol;
sp tm;
p2[0]=1;
for(i=1;i<=16;i++)
p2[i]=p2[i-1]*2;
scanf("%d%d%d",&n,&m,&k);
for(i=1; i<=k; i++)
{
scanf("%d",&sec[i]);
po[sec[i]]=i;
}
bm=(1<<(k+1))-2;
k++;
sec[k]=1;
po[1]=k;
k++;
sec[k]=n;
po[n]=k;
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&j,&tm.no,&tm.co);
li[j].push_back(tm);
}
for(i=1; i<=k; i++)
{
for(j=1;j<=n;j++)
{
be[j]=0;
dtm[j]=0;
}
djk(sec[i]);
for(j=1;j<=n;j++)
dist[i][po[j]]=dtm[j];
}
/* for(i=1;i<=k;i++)
{
for(j=1;j<=k;j++)
printf("%d ",dist[i][j]);
printf("\n");
}*/
sol=SOLM;
if(k>2)
{
for(i=k-2;i>=1;i--)
{
fct(i,bm);
if(din[i][bm]>0 && dist[i][k]>0)
sol=min(sol,din[i][bm]+dist[i][k]);
}
}
else
sol=dist[k-1][k];
printf("%d\n",sol);
return 0;
}