Pagini recente » Cod sursa (job #1081486) | Cod sursa (job #1782399) | Cod sursa (job #2304078) | Cod sursa (job #2481521) | Cod sursa (job #2550432)
#include <bits/stdc++.h>
#define ff first
#define ss second
#define NMAX 2005
#define pb push_back
using namespace std;
const string file = "ubuntzei";
ifstream fin (file+".in");
ofstream fout (file+".out");
typedef long long ll;
typedef long double ld;
const ll INF = 9223372036854775807ll;
const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, inf = 2147483647;
vector <pair<int, int > > v[NMAX];
int dist[NMAX][NMAX],Sol=inf, possiblesol ;
int stv[20],N,M,K;
bool viz[NMAX];
int friends[NMAX];
void bfs(int nod);
void bkt(int k);
queue<int>Q;
int main()
{
int x,y,c;
fin >> N >> M;
fin>>K;
for(int i=1;i<=K;++i)
fin>>friends[i];
for(int i=1;i<=M;++i)
{
fin>>x>>y>>c;
v[x].pb({y,c});
v[y].pb({x,c});
}
friends[0]=1;
for(int i=1;i<=K;++i)
for(int j=1;j<=N;++j) dist[i][j]=-1;
for (int i=1;i<=K;++i) {for(int j=1;j<=N;++j)viz[j]=0;bfs(i);}
for(int j=1;j<=N;++j)viz[j]=0;
bkt(1);
fout<<Sol<<"\n";
return 0;
}
void bfs(int nod)
{
viz[friends[nod]]=1;
Q.push(friends[nod]);
dist[nod][friends[nod]]=0;
while(Q.size())
{
int nodc=Q.front();
Q.pop();
viz[nodc]=0;
for(auto x:v[nodc])
{
int nodv=x.ff;
int cost=x.ss;
if(dist[nod][nodv] == -1)
{
dist[nod][nodv] = dist[nod][nodc]+cost;
viz[nodv]=1;
Q.push(nodv);
}
else if(dist[nod][nodv] > dist[nod][nodc]+cost)
{
dist[nod][nodv] = dist[nod][nodc]+cost;
if(!viz[nodv]) Q.push(nodv), viz[nodv]=1;
}
}
}
}
void bkt(int k)
{
if(k==K+1)
{
possiblesol+= dist[stv[K]][N];
if(possiblesol <= Sol ) Sol = possiblesol;
}
else{
for(int i=1;i<=K;++i)
if(!viz[i])
{
viz[i]=1;
stv[k]=i;
possiblesol += dist[i][friends[stv[k-1]]];
if(possiblesol <= Sol )
bkt(k+1);
possiblesol -= dist[i][friends[stv[k-1]]];
viz[i]=0;
}
}
}