刘汝佳Dijkstra模板

ゝ一纸荒年。 2022-05-30 08:37 291阅读 0赞
  1. const int inf=999999999;
  2. struct Edge{
  3. int from,to,dist;
  4. Edge(int u,int v,int d):from(u),to(v),dist(d){}
  5. };
  6. struct Dijkstra{
  7. int n,m;
  8. vector<Edge> edges;
  9. vector<int > G[maxn];
  10. bool done[maxn]; //永久标记
  11. int d[maxn]; //s到各点距离
  12. int p[maxn];
  13. void init(n){
  14. this->n=n;
  15. for(int i=0;i<n;i++) G[i].clear();
  16. edges.clear();
  17. }
  18. void AddEdge(int from,int to,int dist){
  19. edges.push_back(Edge(from,to,dist));
  20. m=edges.size();
  21. G[from].push_back(m-1);
  22. }
  23. struct HeapNode{
  24. int d,u;
  25. bool operator < (const HeapNode& rhs) const{
  26. return d>rhs.d;
  27. }
  28. };
  29. void dijkstra(int s){
  30. priority_queue<HeapNode> Q;
  31. for(int i=0;i<n;i++) d[i]=inf;
  32. d[s]=0;
  33. memset(done,0,sizeof(done));
  34. Q.push_back(HeapNode{0,s});
  35. while(!Q.empty()){
  36. HeapNode x=Q.top();Q.pop();
  37. int u=x.u;
  38. if(done(u)) continue;
  39. done[u]=true;
  40. for(int i=0;i<G[u].size();i++){
  41. Edge& e=edges[G[u][i]];
  42. if(d[e.to]>d[u]+e.dist){
  43. d[e.to]=d[u]+e.dist;
  44. p[e.to]=G[u][i];
  45. Q.push((HeapNode){d[e.to],e.to});
  46. }
  47. }
  48. }
  49. }
  50. };

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 --开灯问题

    问题描述: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关

    相关 --周期串

    思路: 题目中说过,字符串可能有多个周期,但因为只需求出一个最小的,可以从小到大枚举各个周期,一旦符合就立刻输出;下面的变量只存在自己的循环中。 代码:

    相关 --TeX括号

    思路: 本题的关键是,如何判断一个双引号是“左”引号,还是“右”引号,使用一个标记变量即可。 代码: include<iostream>

    相关 --WERTY

    思路: 每输入一个字符,都可以直接输出一个字符,问题在于如何进行这样的变换呢?一个方法是使用if语句或者witch语句,如:if(c==‘w’)putchar(‘Q’