首页 > 其他分享 >计蒜客:骑车比赛(Dijkstra)

计蒜客:骑车比赛(Dijkstra)

时间:2024-11-08 20:57:38浏览次数:2  
标签:node make second Dijkstra 骑车 pair minHeap 计蒜客 dis

 学习堆优化的写法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, m, a, b, c;
 4 typedef pair<int, int> pii; //first表示距离,second表示节点号
 5 vector<pii> graph[1005];
 6 set<pii> minHeap;
 7 vector<int> dis(1005, INT32_MAX);
 8 vector<bool> visited(1005, false); //记录已完成维护的点集
 9 void dij() {
10     while(!minHeap.empty()) { //维护最小堆以及dis、visited两个数组
11         auto iter = minHeap.begin();
12         int node = iter -> second;
13         minHeap.erase(*iter);
14         visited[node] = true;
15         for (auto i : graph[node]) {
16             if (!visited[i.second]) {
17                 if (dis[i.second] > dis[node] + i.first) {
18                     minHeap.erase(make_pair(dis[i.second], i.second));
19                     dis[i.second] = dis[node] + i.first;
20                     minHeap.insert(make_pair(dis[i.second], i.second));
21                 }
22             }
23         }
24     }
25 }
26 int main() {
27     cin >> n >> m;
28     while(m --) {
29         cin >> a >> b >> c;
30         graph[a].push_back(make_pair(c, b));
31         graph[b].push_back(make_pair(c, a));
32     }
33     dis[1] = 0;
34     minHeap.insert(make_pair(0, 1));
35     dij();
36     cout << dis[n] << endl;
37 }

 

标签:node,make,second,Dijkstra,骑车,pair,minHeap,计蒜客,dis
From: https://www.cnblogs.com/coderhrz/p/18535922

相关文章

  • 计蒜客:网络延迟(DFS/BFS)
     题目要求的是最远的两个节点的距离,即求树的直径(树中所有最短路径距离的最大值即为树的直径 求树的直径有两种做法,两次bfs(或者dfs),另一种是用树形DP本文用两次DFS实现#include<bits/stdc++.h>usingnamespacestd;intn,u,v;vector<int>graph[50005];vector<bool>vi......
  • 计蒜客:最短路简化版(BFS)
     在queue中用结束标识来节约队列空间。也可以用vector来实现队列,用[left,right]控制队列。1#include<bits/stdc++.h>2usingnamespacestd;3intn,m,c;4vector<int>graph[1005];5vector<bool>visited(1005,false);6vector<int>level(1005,0);7queu......
  • 计蒜客:互粉攻略(DFS/BFS)
     因为有重复数据,所以不得不等输入完以后再进行有向图的遍历。1#include<bits/stdc++.h>2usingnamespacestd;3intn,m;4set<int>graph[1005];5vector<bool>visited(1005,false);6vector<pair<int,int>>degree(1005,make_pair(0,0));//(入度,出度)......
  • 计蒜客:修建大桥(并查集/DFS/BFS)
     找到有几张连通图即可解决问题。DFS:1#include<bits/stdc++.h>2usingnamespacestd;3intn,m;4intgraph[1005][1005]={0};5boolvisited[1005]={false};6voiddfs(intp){7if(visited[p]){8return;9}10visited[p]......
  • 计蒜客:公告板(线段树)
     难点在于要把模型抽象出来。第一眼看到题面,想到的是以公告板的高度作为线段树的区间,但看到h<=10^9以后,感觉又开不了这么大的数组。但实际上,最多只有n块公告,所以最极端的情况下不过只有n行,所以区间的真正大小是[1,min(n,h)]。解决了区间的问题,再来考虑每个节点要维护的信息。......
  • 计蒜客:最甜的苹果(线段树)
     样例输入5612345Q15U36Q34Q45U29Q15样例输出5659 这题我们需要维护的信息,从区间的和变成了区间内的最大值。现在区间的内的某个值可能增大可能减小,若从上到下(从根到叶)进行节点更新,我们无法直接判断目前区间内的最大的节点。所以维护区间......
  • 图(邻接矩阵)知识大杂烩!!(邻接矩阵结构,深搜,广搜,prim算法,kruskal算法,Dijkstra算法,拓扑排序)(
     小伙伴们大家好,今天给大家带来图(邻接矩阵)的各种知识,让你看完此文章彻底学会邻接矩阵的相关问题。1.邻接矩阵表示方法1.1知识讲解 我们用一个二维数组arr来表示图。若图为有向图,其中arr【i】【j】=w表示i号点和j号点之间的距离为w,如果i和j之间无路可以设定w=0或无穷。(根......
  • 计蒜客:斑点蛇(线段树)
     样例输入 1012345678910Query13Add36Query27Sub102Add63Query310End  样例输出 63359采用标准模板即可。注意线段树的节点个数一般为其范围的4倍。1#include<bits/stdc++.h>2usingnamespacestd;3vector<int>s(5000......
  • P9466 [EGOI2023] Bikes vs Cars / 骑车与汽车
    题意给定\(B,C\)两个矩阵,你需要构造一张两权图\(G=(V,E=\{(u,v,w_1,w_2)\})\)使得从\(i\)到\(j\)之间:可以只经过\(w_1\geB_{i,j}\)的边连通可以只经过\(w_2\geC_{i,j}\)的边连通不能只经过\(w_1>B_{i,j}\)的边连通不能只经过\(w_2>C_{i,j}\)的边连通构......
  • 搜索算法合集 - By DijkstraPhoenix
    搜索算法合集ByDijkstraPhoenix深度优先搜索(DFS)引入如果现在有一个迷宫,如何走路径最短?方法走迷宫最简单粗暴的方法式什么呢?当然是把所有路都走一遍啦!如果是手动计算的话,可能会把你手指累得抽筋,但电脑不会,电脑具有强大的算力,这种暴力的事情当然是交给电脑做啦。深......