Pagini recente » Cod sursa (job #888006) | Cod sursa (job #1253528) | Cod sursa (job #2096288) | Cod sursa (job #3271079) | Cod sursa (job #2065592)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int N = 2005;
const int K = 24;
const int INF = 999999999;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct poz{
int p,d;
};
int n,m,k;
int v[N];
int dist[N];
bool ales[N];
queue <int> q;
vector <poz> V[N];
int mat[K][(1<<17)+10];
int dst[K][K];
void parc(int p)
{
for(int i = 1; i <= n; i++)
{
dist[i] = INF;
}
q.push(p);
dist[p] = 0;
while(!q.empty())
{
int num = q.front();
q.pop();
ales[num] = 0;
for(int i = 0; i< V[num].size(); i++)
{
int ds = dist[num] + V[num][i].d;
int nx = V[num][i].p;
if(dist[nx] > ds)
{
dist[nx] = ds;
if(ales[nx]==0)
{
ales[nx] = 1;
q.push(nx);
}
}
}
}
}
int main()
{
f>>n>>m;
f>>k;
for(int i = 1; i<= k; i++)
{
f>>v[i];
}
v[0] = 1;
v[k+1] = n;
k++;
for(int i = 1; i<= m; i++)
{
int x,y,ds;
f>>x>>y>>ds;
V[x].push_back({y,ds});
V[y].push_back({x,ds});
}
for(int i = 0; i<= k; i++)
{
parc(v[i]);
for(int j = 0; j<= k; j++)
{
dst[i][j] = dist[v[j]];
//g<<dst[i][j]<<" ";
}
//g<<"\n";
}
int nst = (1<<(k+1));
for(int i = 0; i<=k; i++)
{
for(int j = 0; j< nst; j++)
{
mat[i][j] = INF;
}
}
mat[0][1] = 0;
for(int i = 1; i < nst; i++)
{
for(int bit = 0; bit <= k; bit++)
{
if((i & (1<<bit)) != 0)
{
for(int bit1 = 0; bit1 <= k; bit1++)
{
if((i & (1<<bit1))!=0 && (bit1 != bit))
{
//g<<mat[bit][i]<<" "<<mat[bit][(i ^ (1<<bit))]<<" | "<<(i ^ (1<<bit))<<" "<<bit1<<" "<<i<<"\n";
mat[bit][i] = min(mat[bit][i], mat[bit1][i ^ (1<<bit)] + dst[bit1][bit]);
}
}
//g<<"\n";
}
}
}
g<<mat[k][nst-1];
f.close();
g.close();
return 0;
}