Pagini recente » Cod sursa (job #2753367) | Cod sursa (job #1594928) | Cod sursa (job #2113288) | Cod sursa (job #420032) | Cod sursa (job #2073201)
#include<fstream>
#include<list>
#include<queue>
#include<bitset>
#include<climits>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int NMAX=2005,INF=INT_MAX;
struct graph{
int next_node,cost;
};
struct priot_queue{
int nr_cities,current_node;
};
int dist[NMAX][NMAX],n,m,k;
class cmp{
bool ok;
public:
bool operator ()(const priot_queue &a,const priot_queue &b){
if(ok)
return dist[a.current_node][a.nr_cities]<dist[b.current_node][b.nr_cities];
return dist[a.current_node][a.nr_cities]>dist[b.current_node][b.nr_cities];
}
};
list<graph>g[NMAX];
bitset<NMAX>isCity,in_queue[NMAX];
priority_queue<priot_queue,vector<priot_queue>,cmp>pq;
void read_data(){
int from,to,city,c,i;
fin>>n>>m>>k;
for(i=1;i<=k;++i){
fin>>city;
isCity[city]=true;
}
while(m--){
fin>>from>>to>>c;
g[from].push_back({to,c});
g[to].push_back({from,c});
}
}
void dijkstra(){
list<graph>::iterator it;
int i,nextnode_cost,nextnode;
priot_queue node;
for(i=1;i<=n;++i)
fill(dist[i],dist[i]+1+k,INF);
dist[1][0]=0;
pq.push({0,1});
in_queue[1][0]=true;
while(!pq.empty()){
node=pq.top();
pq.pop();
in_queue[node.current_node][node.nr_cities]=false;
for(it=g[node.current_node].begin();it!=g[node.current_node].end();++it){
nextnode=it->next_node;
nextnode_cost=it->cost;
if(dist[nextnode][node.nr_cities+isCity[nextnode]]>dist[node.current_node][node.nr_cities]+nextnode_cost){
dist[nextnode][node.nr_cities+isCity[nextnode]]=dist[node.current_node][node.nr_cities]+nextnode_cost;
if(!in_queue[nextnode][node.nr_cities+isCity[nextnode]]){
pq.push({node.nr_cities+isCity[nextnode],nextnode});
}
}
}
}
}
int main(){
read_data();
dijkstra();
fout<<dist[n][k];
}