优先队列优化Dijkstra算法
Dijkstra算法在变更起点时会选择没有选择过的最近的点作为起点,优先队列的好处就在于可以在O(log n)的时间内找到那个新起点。
用法
1. 需要包含头文件#include
2. 一共有三个参数 :
type:数据类型;
container:实现优先队列的底层容器;
function:元素之间的比较方式;
模板:
typedef pair<int,int> P;
priority_queue<P, vector<P>, greater<P> >;
在此附上模板题:
这个题卡时间,不用堆优化就会超时。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m, s, k, cnt;
struct bian{
int to;
int w;
int next;
} a[400010];
int head[100005];
long long dis[100005];
int vis[100005];
typedef pair<int,int> P;
void init()
{
for(int i=1;i<=n;i++)
{
head[i] = -1;
dis[i] = 1e9;
}
}
void add(int u, int v, int w)
{
a[cnt].to = v;
a[cnt].next = head[u];
a[cnt].w = w;
head[u] = cnt++;
}
int main()
{
scanf("%d%d%d", &n, &m, &s);
init();
int u, v, w;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}
priority_queue<P, vector<P>, greater<P> > r;
r.push(P(0, s));
dis[s] = 0;
while(r.size()){
P now = r.top();
r.pop();
if(vis[now.second]) continue;
vis[now.second] = 1;
for(int i=head[now.second];i!=-1;i=a[i].next)
{
if(dis[a[i].to] > now.first + a[i].w)
{
dis[a[i].to] = now.first + a[i].w;
r.push(P(dis[a[i].to], a[i].to));
}
}
}
for(int i=1;i<=n;i++)
printf("%lld ", dis[i]);
return 0;
}
谢谢观看!