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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单源最短路径(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;
}

  

以上是关于单源最短路径(dij+堆优化)的主要内容,如果未能解决你的问题,请参考以下文章

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

P4779 模板单源最短路径(标准版)二叉堆优化的 Dijkstra

ybtoj最短路Dijkstra堆例题1单源最短路径

单源最短路径模板(弱化版)

luogu P4779 模板单源最短路径(标准版)

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