Pagini recente » Cod sursa (job #2635584) | Cod sursa (job #163415) | Cod sursa (job #791262) | Cod sursa (job #806386) | Cod sursa (job #1383734)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int INF=0x3fffffff;
const int MAXN=2050;
const int MAXM=10050;
const int MAXK=(1<<17)+5;
struct DRUM
{
int cost,fiu;
};
struct NOD
{
int nod,goal;
};
int important[MAXN],cost[25][MAXK],tcost[20][MAXN];
int best[20][20];
bool inqueue[20][MAXK];
vector <DRUM> drum[MAXN];
vector <int> vip;
NOD tata,fiu;
queue <NOD> q;
bool iq[MAXK + 1],viz[MAXK + 1];
int main()
{
int n,m,k,i,j;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d",&k);
int cnt=0;
vip.push_back(0);
for(i=1;i<=k;i++)
{
scanf("%d",&j);
important[j]=i;
vip.push_back(j);
}
if(important[1]==0)
{
important[1]=k+1;
k++;
vip.push_back(1);
}
if(important[n]==0)
{
important[n]=k+1;
k++;
vip.push_back(n);
}
int x,y,c;
DRUM temp;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
temp.fiu=x;
temp.cost=c;
drum[y].push_back(temp);
temp.fiu=y;
drum[x].push_back(temp);
}
for(i=1;i<=k;i++)
for(j=1;j<=n;j++)
tcost[i][j]=INF;
for(cnt=1;cnt<=k;cnt++)
{
tata.nod=vip[cnt];
q.push(tata);
tcost[cnt][tata.nod]=0;
iq[tata.nod]=1;
while(!q.empty())
{
tata=q.front();
//printf("%d\n",tata.nod);
q.pop();
iq[tata.nod]=0;
if(important[tata.nod])
{
best[cnt][important[tata.nod]]=tcost[cnt][tata.nod];
best[important[tata.nod]][cnt]=best[cnt][important[tata.nod]];
}
for(j=0;j<drum[tata.nod].size();j++)
{
fiu.nod=drum[tata.nod][j].fiu;
if(tcost[cnt][tata.nod]+drum[tata.nod][j].cost<tcost[cnt][fiu.nod])
{
tcost[cnt][fiu.nod]=tcost[cnt][tata.nod]+drum[tata.nod][j].cost;
if(iq[fiu.nod]==0)
{
iq[fiu.nod]=1;
q.push(fiu);
}
}
}
}
}
/*
for(i=1;i<=k;i++)
{
for(j=1;j<=k;j++)
printf("%d ",best[i][j]);
printf("\n");
}//*/
int lim=(1<<k)-1;
for(i=1;i<=k;i++)
for(j=0;j<=lim;j++)
cost[i][j]=INF;
cost[important[1]][1<<(important[1]-1)]=0;
int viz,new_viz,nod;
for(viz=0;viz<=lim;viz++)
{
for(nod=1;nod<=k;nod++)
{
if(((1<<(nod-1))&viz)>0)
{
for(i=1;i<=k;i++)
{
if(((1<<(i-1))&viz)==0)
{
new_viz=viz | (1<<(i-1));
if(cost[nod][viz]+best[nod][i]<cost[i][new_viz])
{
cost[i][new_viz]=cost[nod][viz]+best[nod][i];
}
}
}
}
}
}
printf("%d",cost[important[n]][lim]);
return 0;
}