spfa判负环

大雪菜的课(笔记)

搜索与图论(二)

1.最短路

(5).spfa判负环
模板(spfa判断图中是否存在负环 —— 模板题 AcWing 852. spfa判断负环)

时间复杂度是 O(nm)O(nm), nn 表示点数,mm 表示边数

int n;      // 总点数
int h[N], w[N], e[N], ne[N], idx;       // 邻接表存储所有边
int dist[N], cnt[N];        // dist[x]存储1号点到x的最短距离,cnt[x]存储1到x的最短路中经过的点数
bool st[N];     // 存储每个点是否在队列中

// 如果存在负环,则返回true,否则返回false。
bool spfa()
{
   
    // 不需要初始化dist数组
    // 原理:如果某条最短路径上有n个点(除了自己),那么加上自己之后一共有n+1个点,由抽屉原理一定有两个点相同,所以存在环。

    queue<int> q;
    for (int i = 1; i <= n; i ++ )
    {
   
        q.push(i);
        st[i] = true;
    }

    while (q.size())
    {
   
        auto t = q.front();
        q.pop

你可能感兴趣的:(算法基础·搜索与图论·最短路)