Dijkstra模板(優先佇列)

2021-08-07 10:47:04 字數 2202 閱讀 2994

「二叉堆優化基於貪心的dijkstra演算法」和「優先佇列優化基於bfs的spfa演算法」殊途同歸,都可以得到非負權圖上o(

mlog

n)o (m

logn

)的單源最短路徑演算法。

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

double eps=1e-8;

const

int maxn=1005;

const

int inf=0x3f3f3f3f;

int pre[maxn],dist[maxn];

int cnt[maxn],a[maxn],peo[maxn];

bool vis[maxn];

struct edge

};vector

g[maxn];

struct qnode

bool

operator

< (const qnode &rhs) const

};void init(int n)

}int dijkstra(int s)else

if(dist[v]==dist[u]+cost)

}int main()

int u,v,w;

for(int i=1;i<=m;i++)

dijkstra(s);

printf("%d %d\n",cnt[d],peo[d]);

dfs(s,d);

printf("\n");

}return

0;}

///使用優先佇列dijkstra演算法

///複雜度o(elogv)

///注意初始化

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef pair pii;

const

int maxn=1e4+5;

const

int inf=0x3f3f3f3f;

bool vis[maxn];

int dist[maxn],head[maxn],tot;

int pre[maxn];

struct edge

edge(int _from,int _to,int _cost):from(_from),to(_to),cost(_cost){}

}e[maxn*2];

void addedge(int u,int v,int w)

struct qnode

bool

operator

< (const qnode &rhs) const

};void dijkstra(int n,int st)//點的編號從1開始}}

}int main()

int st,ed;

scanf("%d%d",&st,&ed);

//if(st==ed)

dijkstra(vn,st);

// for(int i=0;i<=vn-1;i++)

// printf("%d ",dist[i]);

// printf("\n");

// for(int i=0;i<=vn-1;i++)

// printf("%d ",pre[i]);

// printf("\n");

if(dist[ed]!=inf) printf("%d\n",dist[ed]);

else

printf("-1\n");

}return

0;}

Dijkstra 模板 鄰接表 優先佇列

時間複雜度 o n m logm include include include using namespace std define mp make pair const int n 100010,m 200010 const int inf 0x7fffffff int fr n nex n d...

Dijkstra優先佇列優化

dijkstra演算法的核心思想就是兩步排序,乙個是對於乙個點而言,他的最小邊要經過所有其他點最小邊的測試才能確認,也就是說要在這其中找乙個最大的邊出來 第二個是對於每次迴圈而言的,每次的更新d陣列都是為了要選出最短的距離。對於每次出佇列的點,都更新他所有的鄰邊 include include in...

優先佇列的dijkstra演算法

一直沒好好整理優先佇列的dijkstra演算法,特此整理 problem description 給出乙個帶權無向圖,包含n個點,m條邊。求出s,e的最短路。保證最短路存在。input 多組輸入。對於每組資料。第一行輸入n,m 1 n n 5 10 5,1 m m 2 10 6 接下來m行,每行三個...