涉及知识点:结构体,构造函数,operator操作符,优先队列使用,邻接矩阵,邻接表
基本思路和上一篇的区别:
上一篇是通过两个for循环的查表操作实现遍历,而创建了优先队列则是把新预选的源点一个个放进集合Q内,通过operator自定义了一个将总步数最小的源点排在前面的优先队列,使得每次弹出的源点都是最小值。
#include <queue>
#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;
const int N = 100;
const int INF = 1e7;
int a[N][N],dist[N],n,m;//使用邻接矩阵存储
int flag[N];
struct Node{
int u,step;
//Node(){};
Node(int a,int sp){
//构造函数
u = a;
step = sp;
}
/*如果不使用构造函数,那么则等同于:
Node q;
q.u = a;
q.step = step;
Q.push(q);
如果使用构造函数,那么可以直接写:
Q(Node(a,step))*/
bool operator< (const Node&a)const{
//自定义操作符<
return step > a.step;
//按步数从小到大排序
}
//意思是:如果新压入的结点step>a.step,那么新结点小于结点a
//因为优先队列默认从大到小,所以结点a放在新结点之前
};
void Dijkstra(int st){
priority_queue<Node> Q;//创建一个数据类型为Node的优先队列
Q.push(Node(st,0));//将源点压入队列
memset(flag,0,sizeof(flag));//初始化
for (int i=1;i<