Pagini recente » Cod sursa (job #677829) | Cod sursa (job #491927) | Cod sursa (job #2754689) | Cod sursa (job #668651) | Cod sursa (job #2512089)
#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];
bool viz[NMAX];
int D[20][20]; // distante intre prt i si prt j. Prt 0 e Cluj, prt K+1 e Vama
int loc[NMAX];
int dist[NMAX];
queue <int> Q;
void bfs(int x)
{
viz[x] = 1;
dist[x] =0;
Q.push(x);
while(Q.size())
{
int nodc = Q.front();
viz[nodc] = 0;
Q.pop();
for (auto nodvecin:v[nodc])
{
if(dist[nodvecin.first] > dist[nodc] + nodvecin.second)
{
dist[nodvecin.first] = dist[nodc] + nodvecin.second;
if(!viz[nodvecin.first]) Q.push(nodvecin.first), viz[nodvecin.first] =1;
}
}
}
Q = queue<int>();
}
int Dc; // distanta curenta
int sol[20] ; // ordinea random din back
int min1= INT_MAX;
int K,N, M;
int plshelp[NMAX];
void bkt(int p)
{
if (p == K + 1)
{
Dc += D[plshelp[loc[sol[K]]]][K+1];
if(Dc < min1) min1=Dc;
}
else{
for(int i=1;i<=K;++i)
if(!viz[i])
{
if(p==1)
{
if(D[0][plshelp[loc[i]]] < min1){
Dc+=D[0][plshelp[loc[i]]];
viz[i] = 1;
sol[1]=i;
bkt(p+1);
viz[i] = 0;
Dc-=D[0][plshelp[loc[i]]];
}
}
else
{if(Dc+D[plshelp[loc[sol[p-1]]]][plshelp[loc[i]]] < min1)
{
Dc+=D[plshelp[loc[sol[p-1]]]][plshelp[loc[i]]];
viz[i] = 1;
sol[p]=i;
bkt(p+1);
viz[i] = 0 ;
Dc-=D[plshelp[loc[sol[p-1]]]][plshelp[loc[i]]];
}
}
}
}
}
int main()
{
int x,y,c;
fin>>N>>M;
fin >> K;
for(int i=1;i<=K;++i)
{fin>>loc[i];plshelp[loc[i]]=i;}
loc[0]=1;
loc[K+1]=N;
for(int i=1;i<=M;++i)
{
fin>>x>>y>>c;
v[x].pb({y,c});
v[y].pb({x,c});
}
for(int i=0; i<=K+1 ; ++i)
{
for(int j=1;j<=N;++j) viz[j]=0, dist[j]=INT_MAX;
bfs(loc[i]) ;
for(int j=0;j<=K+1;j++)
D[i][j] = dist[loc[j]];
}
for(int i=1;i<=K;++i) viz[i]=0;
bkt(1);
fout << min1<<"\n";
return 0;
}