【模板】——dijkstra(堆优化)
dijkstra(堆优化)模板
例题
#include
#include
#include
#include
#define inf 0x3f3f3f3f//无穷大
using namespace std;
const int N=1e6;
int e[N*2],ne[N*2],h[N],cnt=0,w[N],dis[N],st[N]={0},s,m,n;
//w用于存储边的权值;dis存储每个点到源点的距离;st为状态数组,1表示当前点已找到最短路,0则相反
//s为初始点,m为边的数量,n为点的数量
typedef pair pii;//first为到源点距离,second为节点编号
priority_queue,greater >heap;//定义优先队列,注意greater后一定加一个空格
//stl的优先队列默认为大根堆,加上greater后为小根堆
void add(int a,int b,int c)//采取邻接表存储图
{
e[cnt]=b;
ne[cnt]=h[a];
w[cnt]=c;
h[a]=cnt++;
return ;
}
void dijkstra()//dijkstra算法主体
{
memset(dis,0x3f,sizeof dis);//易漏,将dis清成无穷大
dis[s]=0;
heap.push({0,s});
while(!heap.empty())
{
pii t=heap.top();//优先队列与普通队列不同,访问队头用top
heap.pop();
int y=t.second;
if(st[y]==0)
{
st[y]=1;
int v=t.first;
for(int i=h[y];i!=-1;i=ne[i])
{
int j=e[i];
dis[j]=min(dis[j],v+w[i]);//松弛操作
heap.push({dis[j],j});
}
}
}
return ;
}
int main()
{
memset(h,-1,sizeof h);//易漏,必须将链表“数组”清成-1
cin>>m>>n;
for(int i=1;i<=m;i++)
{
int a,b,c;//a->b 且 此边权值为c
cin>>a>>b>>c;
add(a,b,c);
}
cin>>s;
dijkstra();
//最后,若一点到源点距离为inf,则此点与源点不连通,若不等于inf,则dis[该点编号]即为其到源点距离
return 0;
}
ps:转载自即使敌众我寡