邻接表存图 SPFA

简介: 邻接表存图 SPFA

代码来自学长讲课视频,不得不说看大神的代码就是舒服


普通数组邻接表存图

//MAXN代表点的最大数量,MAXM代表边的最大数量 
const int MAXN=10000, MAXM=10000;
int head[MAXN];    //存储第x号点链表的头部位置 
int ver[MAXM];    //存储边的终点信息
int edge[MAXM];    //存储边的边权信息
int nextVer[MAXM]; //存储链表中下一个节点的位置
int total;

//初始化 
memset(head, -1, sizeof(head));
total=0;

//加入从x到y的有向边,权值为z
void addEdge(int x, int y, int z){
   
    total++;    //从1开始存 
    ver[total]=y, edge[total]=z;    //边的信息 
    nextVer[total]=head[x], head[x]=total;//插入链表中 
} 

//访问从x出发的所有边
for (int i=head[x]; i!=-1; i=nextVer[i]){
   
    //找到1条从x到y的边,权值为z 
    int y=ver[i], z=edge[i];
}

vector邻接表存图

const int MAXN=10000, MAXM=10000;
//可以将vector看成一列的形式,对应于一列head。
//每个元素都是一个pair<int, int>类型。表示终点和权值 
vector<pair<int, int>> e[MAXM];

//初始化
for (int i=0; i<MAXN; i++)
    e[i].clear(); 

//添加从x到y边权为z的边信息
//这个就是尾插法插进链表。
//要知道邻接表里每个头顶点连接的链表中的节点顺序无所谓 
void addEdge(int x, int y, int z){
   
    e[x].push_back(make_pair(y, z));
} 

//访问从x出发的所有边
for (int i=0; i<e[x].size(); i++){
   
    //找到一条从x到y的边权为z的边 
    int y=e[x][i].first;
    int z=e[x][i].second;
}

再帖一个spfa+邻接表存图的代码(感觉全忘光了)
https://blog.csdn.net/weixin_42172261/article/details/95390000


洛谷3371

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, int> > edge[50005];
int dis[10005];
int book[10005];
int n, m, s;

void add_edge(int x, int y, int z){
   
    edge[x].push_back(make_pair(y, z));
}
void spfa(){
   
    for (int i=1; i<=n; i++)
        dis[i] = (1<<31) -1;
    dis[s] = 0;
    queue<int> q;
    while (!q.empty())
        q.pop();
    q.push(s);
    book[s] = 1;
    while (!q.empty()){
   
        int t = q.front();
        q.pop();
        book[t] = 0;
        for (int k=0; k<edge[t].size(); k++){
   
            int y=edge[t][k].first;
            int z=edge[t][k].second;
            if (dis[y] > dis[t]+z){
   
                dis[y]=dis[t]+z;
                if (book[y]==0){
   
                    q.push(y);
                    book[y]=1;
                }
            }
        }
    }
}
int main(){
   
    scanf("%d%d%d", &n, &m, &s);
    for (int i=1; i<=m; i++){
   
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        add_edge(x, y, z);
    }
    spfa();
    for (int i=1; i<=n; i++)
        printf("%d ", dis[i]);
    return 0;
}
相关文章
|
2月前
|
算法
Tarjan 求有向图的强连通分量
Tarjan算法是一种用于查找有向图中强连通分量的高效方法。作者分享了自己的笔记,强调了网上解释的不清晰性,并引用了OI Wiki的资源。算法维护每个节点的`dfn`(深度优先搜索顺序)和`low`(能到达的最小DFS序)。通过遍历节点和其邻接节点,更新`low`值,识别环路。当`dfn[x] == low[x]`,表示找到一个强连通分量。代码示例展示了具体的实现细节。
|
3月前
|
存储
邻接表详解
邻接表详解
20 0
|
算法
SPFA算法-最短路-负环
SPFA算法-最短路-负环
67 0
|
3月前
|
存储 算法
最短路之SPFA算法
最短路之SPFA算法
40 0
|
3月前
tarjan求强连通分量
tarjan求强连通分量
21 0
|
9月前
|
算法 C++
用prim和kruskal算法求最小生成树问题
用prim和kruskal算法求最小生成树问题
68 0
拓扑排序(邻接表实现)
拓扑排序(邻接表实现)
156 0
拓扑排序(邻接表实现)
|
存储 JavaScript 算法
邻接表详解(C/C++)
目录 一、概念 二、分类 1)无向图的邻接表 2)有向图的邻接表(出弧) 3)有向图的逆邻接表(入弧) 三.步骤 四、代码
608 0
邻接表详解(C/C++)
|
存储 算法
Kruskal
复习acwing算法基础课的内容,本篇为讲解基础算法:Kruskal,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
87 0
Kruskal