「二叉堆優化基於貪心的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行,每行三個...