Pagini recente » Cod sursa (job #937893) | Cod sursa (job #1829957) | Cod sursa (job #359281) | Cod sursa (job #2277449) | Cod sursa (job #1899548)
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> wow;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int NMAX=375;
const int KMAX=((1<<15)-1)+5;
int n,m,k;
int cost[NMAX][KMAX];
bitset<NMAX> stops;
vector <pair <int,int> > graf[NMAX]; /// nod , cost
priority_queue<pair <int,wow>, vector <pair<int, wow> >, greater < pair <int, wow> > > q; /// cost , nod , stare
void dijkstra()
{
int i,nodActual,confActual,costActual,vecini,nodNou,costNou,copieConf;
cost[1][0]=0;
q.push(make_pair(0,make_pair(1,0)));
while(!q.empty())
{
costActual=q.top().first;
nodActual=q.top().second.first;
confActual=q.top().second.second;
copieConf=confActual;
q.pop();
for(auto w:graf[nodActual])
{
confActual=copieConf;
nodNou=w.first;
costNou=w.second;
if (costActual>cost[nodActual][confActual]) continue;
if (stops[nodNou]!=0) {
confActual=( (confActual) | (1<<(stops[nodNou]-1)) );
}
if (costNou+costActual<cost[nodNou][confActual])
{
cost[nodNou][confActual]=costNou+costActual;
q.push(make_pair(costNou+costActual,make_pair(nodNou,confActual)));
}
}
}
}
int main()
{
int i,j,x,y,costActual,nrfriends=0;
fin>>n>>m>>k;
for (i=1; i<=n; i++) for (j=1; j<=KMAX; j++) cost[i][j]=INT_MAX;
for (i=1; i<=k; i++)
{
fin>>x;
stops[x]=1;
}
for (i=1; i<=m; i++)
{
fin>>x>>y>>costActual;
graf[x].push_back(make_pair(y,costActual));
graf[y].push_back(make_pair(x,costActual));
}
dijkstra();
fout<<cost[n][(1<<k)-1];
return 0;
}