全局准备工作
int N, X; //N为点数 X为源点
int head[MAXN]; //head[src]表示以head为出发点的邻接表表头在数组Adj中的位置,开始时所有元素初始化为-1
int nodeP; //在邻接表和指向表头的head数组中定位用的记录指针,开始时初始化为0
int dist[MAXN]; //储存到源节点的距离,在Spfa()中初始化
bool vis[MAXN]; //这里vis作inqueue解释会更好,出于习惯使用了vis来命名,在Spfa()中初始化
Node定义
struct Node {
int v, w, next;
}Adj[MAXM];
v即vertex,这里意思相当于被指向的点to,w相当于weight,代表边权,next用来指向在Adj中下一个从相同src出发的边指向的点
addEdge函数
void addEdge(int src, int to, int weight)
{
Adj[nodeP].v = to;
Adj[nodeP].w = weight;
Adj[nodeP].next = head[src];
head[src] = nodeP++;
}
addEdge(a, b, w)作用是在数组Adj中留下一条记录了去向和边权的记录,且其next指向表中相同src指向的下一个点,同时更新了head表头
Spfa主体
void Spfa()
{
queue<int> que;