写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个;

香甜的奶油:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cstdlib>
  6. #include<ctime>
  7. #include<vector>
  8. #include<algorithm>
  9. #include<queue>
  10. using namespace std;
  11. #define LL long long
  12. const int maxn=;
  13. const int inf=;
  14. int d[maxn],vis[maxn],n,m,p,b[maxn];
  15. struct node{
  16. int y,next,v;
  17. }e[];
  18. int linkk[maxn],len=;
  19. void insert(int x,int y,int v){
  20. e[++len].y=y;
  21. e[len].next=linkk[x];
  22. linkk[x]=len;
  23. e[len].v=v;
  24. }
  25. typedef pair<int,int> pii;
  26. priority_queue<pii,vector<pii>,greater<pii> > q;
  27. int dij(int s){
  28. while(!q.empty())q.pop();
  29. q.push(make_pair(,s));
  30. memset(d,,sizeof(vis));d[s]=;
  31. memset(vis,,sizeof(vis));
  32. while(!q.empty()){
  33. int v=q.top().first;
  34. int x=q.top().second;
  35. q.pop();
  36. vis[x]=;
  37. for(int i=linkk[x];i;i=e[i].next){
  38. if(vis[e[i].y])continue;
  39. if(d[e[i].y]>v+e[i].v){
  40. d[e[i].y]=v+e[i].v;
  41. q.push(make_pair(d[e[i].y],e[i].y));
  42. }
  43. }
  44. }
  45. int ans=;
  46. for(int i=;i<=n;i++)ans+=d[b[i]];
  47. return ans;
  48. }
  49. void init(){
  50. scanf("%d%d%d",&n,&p,&m);//cow,muchang,daolu
  51. for(int i=;i<=n;i++)scanf("%d",&b[i]);
  52. int x,y,v;
  53. for(int i=;i<=m;i++){
  54. scanf("%d%d%d",&x,&y,&v);
  55. insert(x,y,v);insert(y,x,v);
  56. }
  57. }
  58. void work(){
  59. int minn=inf;
  60. for(int i=;i<=p;i++)minn=min(minn,dij(i));
  61. cout<<minn<<endl;
  62. }
  63. int main(){
  64. //freopen("1.in","r",stdin);
  65. //freopen("1.out","w",stdout);
  66. init();
  67. work();
  68. }

最后的结果是这种情况下的dij跑得比spfa慢不少;

当然可能是我用了stl,常数太大;

spfa和堆优化dij的唯一区别是一个用队列,需要多次迭代找出最优(也可能直接就找到最优值),一个用堆,可以直接找到一个不确定的点的最优值,但由于用了堆,复杂度要乘一个log;

其他的基本一样的;

spfa稀疏图好用,dij稠密图好用,上面的那道题就是个例子;

dij+堆优化的更多相关文章

  1. codeforces 449B Jzzhu and Cities (Dij+堆优化)

    输入一个无向图<V,E>    V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...

  2. 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

  3. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  4. B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij

    B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...

  5. 【洛谷P1462】【二分+堆优化dij】

    题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每次经过一个城市,都会被收取 ...

  6. [CF1209F]Koala and Notebook_堆优化dij

    Koala and Notebook 题目链接:https://codeforces.com/contest/1209/problem/F 数据范围:略. 题解: 开始的时候看错题了....莫名其妙多 ...

  7. [CF1146D]Frog Jumping_exgcd_堆优化dij

    Frog Jumping 题目链接:http://codeforces.com/contest/1146/problem/D 数据范围:略. 题解: 首先发现,如果$x\ge a +b$,那么所有的$ ...

  8. Dij的堆优化

    #include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #i ...

  9. Dijkstra堆优化学习

    最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...

随机推荐

  1. js遍历map匹配数据和js遍历数组匹配map数据

    var __LocalDataCities = { list: { "010": ["北京", "BEIJING"], "0100 ...

  2. OS | Socket

    TCP 创建socket: int socket(int domain, int type, int protocol); AF = Address FamilyPF = Protocol Famil ...

  3. Java并发容器,底层原理深入分析

    ConcurrentHashMap ConcurrentHashMap底层具体实现 JDK 1.7底层实现 将数据分为一段一段的存储,然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据时, ...

  4. 【spring cloud】spring cloud子module的pom文件添加依赖,出现unknown问题【maven】

    spring cloud项目,一般都是父项目中有多个子服务,也就是子module模块. 如下图: 问题描述:在父项目中引用了常用的jar包,例如,引入了spring boot的依赖,那么在子项目中引入 ...

  5. 第一个AngularJS Sample

    代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3. ...

  6. iOS UI08_tableView省市区字典数组

    北京 1 北京市 1 西城区 1 东城区 2 崇文区 3 宣武区 4 朝阳区 5 丰台区 6 石景山区 7 海淀区 8 门头沟区 9 房山区 10 通州区 11 顺义区 12 昌平区 13 大兴区 1 ...

  7. Go语言中的单引号、双引号、反引号

    =Start= 搜索关键字: golang single quotes golang double quotes golang back quotes 参考结果: 结论写在最前:在Go语言中不倾向于使 ...

  8. 邻接表的使用及和vector的比較

    这几天碰到一些对建边要求挺高的题目.而vector不好建边,所以学习了邻接表.. 以下是我对邻接表的一些看法. 邻接表的储存方式 邻接表就是就是每一个节点的一个链表,而且是头插法建的链表,这里我们首先 ...

  9. C语言-回溯例3

    排列问题 1.实现排列A(n,m)对指定的正整数m,n(约定1<m<=n),具体实现排列A(n,m).2. 回溯算法设计设置一维数组a,a(i)(i=1,2,…,m)在1—n中取值.首先从 ...

  10. C语言-二维背包问题

    二维费用背包问题 问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有 一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价 ...