Pagini recente » Cod sursa (job #1853107) | Cod sursa (job #849958) | Cod sursa (job #2452787) | Monitorul de evaluare | Cod sursa (job #1927836)
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#define inf 2147483643
#define nmax (1<<17)+2
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector <int> V[2001];
long long k,a[20],d[20][2001],n,m,di[nmax][20];
queue <int> C;
void BFS(int pos)
{ int x,v,c,i;
x=a[pos];
d[pos][x]=0;
C.push(x);
C.push(0);
while(!C.empty())
{ v=C.front(); C.pop();
c=C.front(); C.pop();
for(i=0;i<V[v].size();i=i+2)
if( c+V[v][i+1] < d[pos][V[v][i]] )
{ d[pos][V[v][i]]=c+V[v][i+1];
C.push(V[v][i]);
C.push(c+V[v][i+1]);
}
}
}
int main()
{
int i,j,x,y,z,ct=0,l;
fin>>n>>m;
fin>>k;
for(i=1;i<=k;++i)
{ fin>>j;
if(j!=1 && j!=n)
a[++ct]=j-1;
}
a[++ct]=n-1;
for(i=1;i<=m;++i)
{ fin>>x>>y>>z;
V[x-1].push_back(y-1); V[x-1].push_back(z);
V[y-1].push_back(x-1); V[y-1].push_back(z);
}
for(i=0;i<=ct;++i)
for(j=0;j<n;++j)
d[i][j]=inf;
for(i=0;i<=ct;++i)
BFS(i);
// for(i=0;i<=ct;++i)
//{ for(j=0;j<n;++j)
// fout<<d[i][j]<<" ";
// fout<<"\n";
// }
if(ct!=0)
{
for(i=1;i< 1<<(ct+1);++i)
for(j=0;j<=ct;++j)
di[i][a[j]]=inf;
di[1][0]=0;
// fout<<di[ 1<<(ct+1)-1][n-1]<<"\n";
for(i=1;i< 1<<(ct+1);++i)
for(j=0;j<=ct;++j)
if(i&(1<<j) && di[i][j]!=inf)
{
for(l=0;l<=ct;++l)
if(!(i&(1<<l)) && di[i][j]+d[a[j]][a[l]] < di[i+(1<<l)][a[l]] )
di[i+(1<<l)][a[l]]=di[i][j]+d[a[j]][a[l]];
}
fout<<di[ (1<<(ct+1)) -1 ][n-1];
// for(i=0;i<=ct;++i) fout<<a[i]<<" ";
}
else fout<<d[0][n-1];
return 0;
}