Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- #include <queue>
- using namespace std;
- struct node{
- int d;
- int r;
- bool operator>(const node& n)const{
- return d>n.d;
- }
- };
- int n,h,m,a,b,t,c;
- bool is_hotel[10010];
- vector<pair<int,int> > rds[10010];
- vector<int> r_bfs[10010];
- priority_queue<node,vector<node>,greater<node> > q;
- queue<node> qu;
- node top;
- bool vis[10010];
- int main()
- {
- while(1){
- cin>>n;
- if(n==0)break;
- cin>>h;
- memset(is_hotel,0,sizeof(is_hotel)/sizeof(bool));
- for(int i=0;i<h;i++){cin>>c; is_hotel[c-1]=true;}
- cin>>m;
- while(m--){
- cin>>a>>b>>t;
- a--; b--;
- rds[a].push_back(make_pair(t,b));
- rds[b].push_back(make_pair(t,a));
- }
- // DIJSKTRA
- for(int i=0;i<n;i++){
- if(!(is_hotel[i] || i==0))continue;
- memset(vis,0,sizeof(vis)/sizeof(bool));
- q=priority_queue<node,vector<node>,greater<node> >();
- q.push({0,i});
- while(!q.empty()){
- top=q.top();
- q.pop();
- if(vis[top.r] || top.d>600)continue;
- vis[top.r]=true;
- if((top.r!=i) && (top.r==n-1 || is_hotel[top.r]))r_bfs[i].push_back(top.r);
- for(int j=0;j<rds[top.r].size();j++){
- q.push({top.d+rds[top.r][j].first,rds[top.r][j].second});
- }
- }
- }
- for(int i=0;i<n;i++)
- rds[i].clear();
- // BFS
- memset(vis,0,sizeof(vis)/sizeof(bool));
- qu = queue<node>();
- qu.push({0,0});
- bool f=false;
- while(!qu.empty()){
- top=qu.front();
- qu.pop();
- if(vis[top.r])continue;
- vis[top.r]=true;
- if(top.r==n-1){f=1; break;}
- for(int j=0;j<r_bfs[top.r].size();j++){
- qu.push({top.d+((r_bfs[top.r][j]==n-1)?0:1),r_bfs[top.r][j]});
- }
- }
- for(int i=0;i<n;i++)
- r_bfs[i].clear();
- if(f)
- cout<<top.d<<endl;
- else
- cout<<"-1"<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement