Pagini recente » Cod sursa (job #3172224) | Cod sursa (job #2688466) | Cod sursa (job #1186684) | Cod sursa (job #1348827) | Cod sursa (job #1377265)
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int INF=0x7fffffff;
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[MAXN][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;
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=0;i<=k;i++)
for(j=0;j<=n;j++)
tcost[i][j]=INF;
for(i=1;i<=2000&&cnt<=k;i++)
if(important[i])
{
cnt++;
tata.nod=i;
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]&&tata.nod!=i)
{
best[i][tata.nod]=tcost[cnt][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);
}
}
}
}
//printf("\n\n");
}
///*
int lim=1<<k;
for(i=0;i<=18;i++)
for(j=0;j<lim;j++)
cost[i][j]=INF;
tata.nod=1;
tata.goal=1<<(important[1]-1);
q.push(tata);
inqueue[tata.nod][tata.goal]=true;
cost[important[tata.nod]][tata.goal]=0;
while(!q.empty())
{
//printf("%d %d\n",tata.nod,tata.goal);
tata=q.front();
q.pop();
inqueue[tata.nod][tata.goal]=false;
for(i=0;i<vip.size();i++)
{
if(vip[i]==tata.nod)
continue;
fiu.goal=tata.goal;
fiu.nod=vip[i];
if(important[fiu.nod]<=k)
{
fiu.goal|=1<<(important[fiu.nod]-1);
}
if(cost[important[tata.nod]][tata.goal]+best[tata.nod][fiu.nod]<cost[important[fiu.nod]][fiu.goal])
{
cost[important[fiu.nod]][fiu.goal]=cost[important[tata.nod]][tata.goal]+best[tata.nod][fiu.nod];
if(inqueue[fiu.nod][fiu.goal]==false)
{
inqueue[fiu.nod][fiu.goal]=true;
q.push(fiu);
}
}
}
}
printf("%d",cost[important[n]][(1<<k)-1]);//*/
return 0;
}