Pagini recente » Cod sursa (job #1952650) | Cod sursa (job #1499089) | Cod sursa (job #881804) | Istoria paginii runda/oji_xi/clasament | Cod sursa (job #1227683)
#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][2005];
bool be[2005],b2[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;
// printf("%d %d %d\n",tmp.no,tm2.no,tm2.co);
if(dtm[tm2.no]>tm2.co)
{
dtm[tm2.no]=tm2.co;
pq.push(tm2);
}
}
}
}
}
int fct(int nod,int bm)
{
int i,sol,x,y;
sol=SOLM;
if(bm==p2[nod])
{
din[nod][bm]=dist[k-1][nod];
}
if(din[nod][bm]>0)
return din[nod][bm];
for(i=k;i>0;i--)
if((bm & p2[i]) && dist[i][nod]>0)
{
x=bm-p2[nod];
y=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,x;
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);
x=j;
j=tm.no;
tm.no=x;
li[j].push_back(tm);
}
for(i=1; i<=k; i++)
{
for(j=0;j<=n;j++)
{
be[j]=0;
dtm[j]=SOLM;
}
dtm[sec[i]]=0;
djk(sec[i]);
for(j=1;j<=n;j++)
dist[i][po[j]]=dtm[j];
}
sol=SOLM;
if(k>2)
{
for(i=k-2;i>=1;i--)
{
din[i][bm]=0;
x=fct(i,bm);
if(din[i][bm]>0 && dist[i][k]>0)
{
if(din[i][bm]+dist[i][k]<sol)
sol=din[i][bm]+dist[i][k];
sol=min(sol,din[i][bm]+dist[i][k]);
}
}
printf("%d\n",sol);
}
else
{
sol=dist[k-1][k];
printf("%d\n",sol);
}
/* for(i=1;i<=k;i++)
{
for(j=1;j<=k;j++)
printf("%d ",dist[i][j]);
printf("\n");
}*/
return 0;
}