Pagini recente » Borderou de evaluare (job #1293614) | Borderou de evaluare (job #2810238) | Borderou de evaluare (job #2146551) | Borderou de evaluare (job #2632921) | Cod sursa (job #3002822)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <cstring>
#include <queue>
using namespace std;
const int NMAX = 2001;
const int BMAX = 1024;
const int INF = 2 * 1e9 + 1;
vector <pair <int, int> > a[NMAX];
int prieteni[NMAX];
int d[NMAX][BMAX];
struct Nod
{
int cost, id, bitmask;
};
class Compare
{
public:
bool operator()(Nod a, Nod b)
{
return a.cost > b.cost;
}
};
void dijkstra()
{
priority_queue <Nod, vector<Nod>, Compare> pq;
d[1][0] = 0;
Nod nn = {0, 1, 0};
pq.push(nn);
while(!pq.empty())
{
Nod n = pq.top();
pq.pop();
for(auto y: a[n.id])
{
int newbitmask = n.bitmask;
if(prieteni[y.first] != -1)
{
int vid = prieteni[y.first];
newbitmask = newbitmask | (1<<vid);
}
int c = y.second + n.cost;
if(c < d[y.first][newbitmask])
{
d[y.first][newbitmask] = c;
pq.push({c, y.first, newbitmask});
}
}
}
}
int main()
{
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m;
fin >> n >> m;
int k;
fin >> k;
for(int i = 0; i <= n; i++)
prieteni[i] = -1;
for(int i = 0; i < k; i++)
{
int x;
fin >> x;
prieteni[x] = i;
}
for(int i = 0; i <= n; i++)
for(int j = 0; j <= 1<<k; j++)
d[i][j] = INF;
//memset(d, INF, NMAX * BMAX * sizeof(int));
for(int i = 1; i <= m; i++)
{
int x, y, c;
fin >> x >> y >> c;
a[x].push_back(make_pair(y, c));
a[y].push_back(make_pair(x, c));
}
/*for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= 1<<k; j++)
fout << d[i][j] << " ";
fout << "\n";
}
fout << "\n";*/
dijkstra();
/*for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= 1<<k; j++)
fout << d[i][j] << " ";
fout << "\n";
}*/
fout << d[n][(1<<k) - 1];
return 0;
}