Pagini recente » Cod sursa (job #3185649) | Cod sursa (job #1912256) | Cod sursa (job #2517270) | Cod sursa (job #2946315) | Cod sursa (job #2563023)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define inf 1000000000
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
vector<pair<int,int> >v[2010];
priority_queue <pair<int,int >,vector< pair<int,int> >,greater< pair<int,int > > >pq;
pair<int,int >tt;
int n,m,a,b,c,ap[18],k,d[18][2000],ma[524300][20];
int main()
{
fin>>n>>m>>k;
for(int i=0;i<k;i++)
fin>>ap[i];
ap[k]=1;
ap[k+1]=n;
for(;m;m--)
{
fin>>a>>b>>c;
v[a].push_back(make_pair(c,b));
v[b].push_back(make_pair(c,a));
}
///dijkstra din cele k orase+orasul 1+orasul n
for(int i=0;i<=k+1;i++)
{
///ap[i]
for(int j=0;j<=n;j++)
d[i][j]=inf;
d[i][ap[i]]=0;
pq.push(make_pair(0,ap[i]));
while(!pq.empty())
{
tt=pq.top();
pq.pop();
if(tt.first==d[i][tt.second])
{
for(auto it:v[tt.second])
{
if(it.first+tt.first<d[i][it.second])
{
d[i][it.second]=it.first+tt.first;
pq.push(make_pair(d[i][it.second],it.second));
}
}
}
}
}
if(k==0)
{
fout<<d[k][n];
return 0;
}
int maxx=(1<<k)-1;
for(int i=1;i<=maxx;i++)
for(int j=0;j<k;j++)
ma[i][j]=inf;
for(int i=0;i<=k;i++)
{
ma[1<<i][i]=d[k][ap[i]];
}
for(int i=1;i<=maxx;i++)
{
for(int j=0;j<k;j++)
{
if(i&(1<<j))
{
for(int q=0;q<k;q++)
{
if((i-(1<<j))&(1<<q))
{
ma[i][j]=min(ma[i][j],ma[i-(1<<j)][q]+d[q][ap[j]]);
}
}
}
}
///fout<<endl;
}
int minn=inf;
for(int j=0;j<k;j++)
{
if(d[k+1][ap[j]]!=inf)
minn=min(minn,ma[maxx][j]+d[k+1][ap[j]]);
}
fout<<minn;
/*
cout<<k<<endl;
for(int i=0;i<k;i++)
cout<<ma[(1<<k)-1][i]<<" ";
cout<<endl<<endl;
int minn=inf;
for(int j=0;j<k;j++)
{
minn=min(minn,d[k][ap[j]]);
}
fout<<minn<<endl;
int minnham=inf;
for(int j=0;j<k;j++)
{
cout<<ma[(1<<k)-1 ][j]<<" ";
minnham=min(minnham,ma[(1<<k)-1 ][j]+d[j][n]);
}
fout<<minnham<<endl;
fout<<minnham+minn;*/
/*
for(int i=2;i<k;i++)
{
///fout<<ma[(1<<k)-2][i]<<" "<<ap[i]<<" "<<d[k][ap[i]]<<endl;
minn=min(minn,ma[(1<<k)-2][i]+d[k][ap[i]]);
}
fout<<minn;*/
return 0;
}
/*
for(int i=6;i<=(1<<k);i++)
for(int j=1;j<=k;j++)
ma[i][j]=inf;
for(int i=1;i<=(1<<k);i++)
ma[(1<<i)][i]=0;
for(int i=6;i<=(1<<k)-2;i=i+4)
{
for(int j=2;j<k;j++)
{
if(i&(1<<j))
{
for(int h=2;h<k;h++)
{
if((1<<h)&(i-(1<<j)))
{
cout<<i<<" "<<j<<" "<<ma[i][j]<<" "<<h<<" "<<d[h][ap[j]]<<endl;
ma[i][j]=min(ma[i][j],ma[i-(1<<j)][h]+d[h][ap[j]]);
}
}
}
}
}
for(int i=2;i<k;i++)
{
fout<<ma[(1<<k)-2][i]<<" "<<ap[i]<<endl;
}
*/