Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <queue>
- #include <utility>
- #define ii pair<int, int>
- #define MAX 1e9
- using namespace std;
- vector < vector<ii> > matrix;
- int N;
- int visit_time[1005];
- void calculate_time(int st){
- visit_time[0].second = 0;
- for (int i = 1; i < st; i++){
- visit_time[i].second = visit_time[i - 1] + matrix[visit_time[i - 1]][visit_time[i]].second;
- }
- }
- int dijkstra(int start, int target){
- vector<int> dist;
- dist.resize(N, MAX);
- priority_queue <ii> pq;
- pq.push(ii(0, start));
- while (!pq.empty()){
- ii front = pq.top(); pq.pop();
- int d = -front.first, u = front.second;
- if (d > dist[u]) continue;
- for (int i = 0; i < matrix[u].size(); i++){
- ii v = matrix[u][i];
- if (dist[u] + v.second < dist[v.first])
- dist[v.first] = dist[u] + v.second;
- pq.push(ii(-dist[v.first], v.first));
- }
- }
- return dist[target];
- }
- int main(){
- int M,start,target,t_start,g_streets;
- scanf("%d %d",&N,&M);
- scanf("%d %d %d %d", &start, &target, &t_start, &g_streets);
- for(int i = 0; i < g_streets; i++)
- scanf("%d", &visits[i].first);
- for (int i = 0; i < M; i++){
- int u, v, t;
- scanf("%d %d %d", &u, &v, &t);
- matrix[u].push_back(ii(v, t));
- matrix[v].push_back(ii(u, t));
- }
- calculate_time();
- printf("%d\n", dijkstra(start, target));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement