单源最短路径(dij+堆优化)

单源最短路径的模板题,感谢同学余能的帮助~

#include<bits/stdc++.h>
#define inf 2147483647
using namespace  std;
bool book [200004];
int cnt=0;
int head[200020];
int n,m,qq;

struct Edge
{
   int to,next,w;
}e[2000005];

struct Dis
{
     int to,w;
}dis[20000];

struct cmp1
{
   bool operator () (Dis &a,Dis &b){
      return a.w>b.w;
   }
};

priority_queue<Dis ,vector<Dis>, cmp1> q;
void add(int a,int b,int c)
{
     e[++cnt].to=b;
     e[cnt].w=c;
     e[cnt].next=head[a];
     head[a]=cnt;
}

void dijkstra(int k)
{
    for(int i=1;i<=n;i++)
    {
	   dis[i].to=i;
	   dis[i].w=inf;
	}
	dis[k].w=0;
	q.push(dis[k]);
    book[0]=1;
	while(!q.empty())
	{
	   Dis t=q.top();q.pop();
	   int x=t.to;
	   if(book[x]) continue;
	   book[x]=1;
	   for(int i=head[x];i;i=e[i].next)
	   {
	      int j=e[i].to;
		  if(dis[j].w>dis[x].w+e[i].w&&!book[j])
	      {
		     dis[j].w=dis[x].w+e[i].w;
		     q.push(dis[j]);
		  }
	   }
	}
}

int main()
{
   cin>>n>>m>>qq;
   int t1,t2,t3;
   for(int i=1;i<=m;i++)
   {
      cin>>t1>>t2>>t3;
      add(t1,t2,t3);
   }
   dijkstra(qq);
   for(int i=1;i<=n;i++)
     cout<<dis[i].w<<" ";
   return 0;
}

  

时间: 2024-08-10 00:07:40

单源最短路径(dij+堆优化)的相关文章

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

用小根堆实现dijkstra,求图的单源最短路径

小根堆实现dijkstra 求图的最短路径,最常用的有四种方法: 1.Floyed(弗洛伊德)算法.最简单的最短路径算法,可以求多源最短路径.时间复杂度为O(n*n*n). 2.Dijkstra(迪杰斯特拉)算法.只能求单源最短路径.时间复杂度为O(n*n). 3.Bellman-Ford(贝尔曼福德)算法.只能求单源最短路径.时间复杂度为O(NE)(N为顶点数,E是边数). 4.SPFA算法.为Bellman-Ford算法的队列实现,减少不必要的冗杂计算.只能求单源最短路径.时间复杂度为O(k

luogu P3371 &amp; P4779 ---单源最短路径spfa &amp; 最大堆优化Dijkstra

P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三个整数Fi.Gi.Wi,分别表示第i条有向边的出发点.目标点和长度. 输出格式: 一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i

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

首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 让我来翻译一下:Dijkstra可以求出一个点到一个图中其他所有节点的最短路径,故也称对于单源最短路径的一种解法 算法实现步骤: a.初始时,只包括源点,即S = {v},v的距离为0.U包含除v以外的其他顶点,即

Dijkstra求解单源最短路径

Dijkstra(迪杰斯特拉)单源最短路径算法 Dijkstra思想 Dijkstra是一种求单源最短路径的算法. Dijkstra仅仅适用于非负权图,但是时间复杂度十分优秀. Dijkstra算法主要思想是: 主要思想是,将结点分成两个集合:已确定最短路长度的,未确定的. 一开始第一个集合里只有节点V. 然后重复这些操作: 1.对那些刚刚被加入第一个集合的结点的所有出边执行松弛操作. 2.从第二个集合中,选取一个最短路长度最小的结点,移到第一个集合中. 用暴力算法的时间复杂度是Ο(n2+m)

单源最短路径 Bellman_ford 和 dijkstra

首先两个算法都是常用于 求单源最短路径 关键部分就在于松弛操作 实际上就是dp的感觉 if (dist[e.to] > dist[v] + e.cost) { dist[e.to] = dist[v] + e.cost; ... } bellman_ford O(E*V) 但是配合队列可以 有spfa 可以达到O(kE) http://www.360doc.com/content/13/1208/22/14357424_335569176.shtml 并且bellman_ford还适用于负边 并

hdu1245+dij,堆优化

有一片100*100的湖泊,中心坐标(0,0),即湖泊右上角的坐标是(50,50),湖泊中间有一片以(0,0)为圆心,15为直径的圆形陆地.现有一个人在陆地,湖泊中散布着一些点可以踩,这个人要利用这些点跳到岸上,求最短路径和最短路径下的最短步数. spfa莫名其妙的超时,dij+堆优化反而能过...可能spfa更适合有向图吧. 使用vector<vector<node> > g这种双重结构时,最好先g.resize(N)设置一下容量,否则直接插入会出错. 1 #include<

ZOJ– 2770Burn the Linked Camp单源最短路径差分约束系统

ZOJ Problem Set – 2770 Burn the Linked Camp 题目的大意为: 陆逊侦查得知刘备将自己的军队分为N个营,从左到右编号为1,2,3…N.第i个营有最大士兵数Ci,通过一段时间的观察,陆逊可以估算至少有k个士兵住在第i到第j个营地,最后陆逊必须要估算刘备的军队至少有多少士兵,以便应对. 输入: 有多个测试案例,在每个测试案例的第一行,有两个整数N(0<n<=1000)和M(0 <= M = 10000).第二行中,有n个整数C1…CN.然后M行,每行有

(转)图算法单源最短路径Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一.前言 最短路径算法,顾名思义就是求解某点到某点的最短的距离.消耗.费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离.比方说,我们把地图上的每一个城市想象成一个点,从一个城市到另一个城市的花费是不一样的.现在我们要从上海去往北京,需要考虑的是找到一条路线,使得从上海到北京的花费最小.有人可能首先会想到,飞机直达啊,这当然是时间消耗最小的方法,但是考虑到费用的高昂,这条线路甚至还不如上海到北京的高铁可取.更有甚者,假设国家开通了从上海到西藏,再从西藏到兰州