首页 > 编程语言 >SPFA算法

SPFA算法

时间:2024-02-25 18:44:35浏览次数:24  
标签:int MAX ll 算法 vis SPFA INF worth

一、单源最短路径

typedef long long ll;

const int MAX = 2e3 + 5;
const ll INF = numeric_limits<ll>::max();

typedef struct
{
	int to, worth;
} edge;

int n, m;
vector<edge> G[MAX];
ll d[MAX];
bool vis[MAX];

void spfa(int s)
{	
	fill(d + 1, d + 1 + n, INF);
	d[s] = 0;
	
	queue<int> Q;
	Q.push(s);
	vis[s] = true;
	while (!Q.empty())
	{
		int u = Q.front();
		Q.pop();
		vis[u] = false;
		
		for (int i = 0; i < G[u].size(); i++)
		{
			edge e = G[u][i];
			if (d[u] != INF && d[e.to] > d[u] + e.worth)
			{
				d[e.to] = d[u] + e.worth;
				if (!vis[e.to])
				{
					Q.push(e.to);
					vis[e.to] = true;
				}
			}
		}
	}
}

二、判断负环

typedef long long ll;

const int MAX = 2e3 + 5;
const ll INF = numeric_limits<ll>::max();

typedef struct
{
	int to, worth;
} edge;

int n, m;
vector<edge> G[MAX];
ll d[MAX];
bool vis[MAX];

int cnt[MAX]; // 各点遍历次数

bool spfa(int s)
{	
	fill(d + 1, d + 1 + n, INF);
	d[s] = 0;
	
	queue<int> Q;
	Q.push(s);
	vis[s] = true;
	cnt[s]++; 
	while (!Q.empty())
	{
		int u = Q.front();
		Q.pop();
		vis[u] = false;
		
		for (int i = 0; i < G[u].size(); i++)
		{
			edge e = G[u][i];
			if (d[u] != INF && d[e.to] > d[u] + e.worth)
			{
				d[e.to] = d[u] + e.worth;
				if (!vis[e.to])
				{
					Q.push(e.to);
					vis[e.to] = true;
					cnt[e.to]++;
					if (e.to >= n)
						return true;
				}
			}
		}
	}
	return false;
}

标签:int,MAX,ll,算法,vis,SPFA,INF,worth
From: https://www.cnblogs.com/hoyd/p/18032726

相关文章

  • 2024牛客寒假算法基础集训营6
    A.欧拉筛处理出素数直接3重暴力循环找#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fboolis_prime[N];//是否是质数,0为是,1为不是intprime[N];//质数数组inttop=1;//质数的下标intmin_p[N];//最小......
  • 2024牛客寒假算法基础集训营6 H 纷乱的红线 题解
    Question2024牛客寒假算法基础集训营6H纷乱的红线小红拿到了一个圆,以及平面上有\(n\)个点(保证没有三点共线)。现在小红将随机取\(3\)个点画一个三角形,她想知道这个三角形和圆的交点数量的期望是多少?Solution考虑到\(n\le1000\)可以枚举每一条线,计算这一条线和圆的交......
  • 提高组算法-树状数组
    树状数组是当序列动态变化时,依然可以高效率的查询和维护前缀和(或区间和)的数据结构。实现思路现在有\(16\)个数字:\(a[]={1,8,5,9,6,3,9,8,7,2,3,9,6,4,1,7}\)。我们要实现\(2\)个函数:修改其中某个元素的数值。求出前\(n\)个数字的和。但是,这\(2\)个函数要在极......
  • 加密算法/常见编码
    MD51.MD5算法是单向散列算法的一种。单向散列算法也称为HASH算法,是一种将任意长度的信息压缩至某一固定长度(称之为消息摘要)的函数(该压缩过程不可逆)。在MD5算法中,这个摘要是指将任意数据映射成一个128位长的摘要信息(32位的数字字母混合码)。MD5值是32位或者16位由数字"0-9"和字......
  • 2024牛客寒假算法基础集训营6 G 人生的起落 题解
    Question2024牛客寒假算法基础集训营6G人生的起落定义一个三元组\((x,y,z)\)是“v-三元组”当且仅当该三元组满足以下条件:\(x=z\)\(x>y\)现在需要你构造一个\(n\)个正整数组成的数组,所有元素之和恰好等于\(S\),且恰好有\(k\)个长度威\(3\)的连续子数组......
  • 算法面经
    数组88. 合并两个有序数组经典逆向双指针voidmerge(vector<int>&nums1,intm,vector<int>&nums2,intn){for(inti=m-1,j=n-1,k=m+n-1;~j;k--){nums1[k]=i>=0&&nums1[i]>nums2[j]?nums1[i--]:......
  • 走进Kaggle的未知领域:性别和年龄推断算法解析
    ​1、环境设置:此环节将加载实现笔记本无缝功能的基本模块,包括NumPy、Pandas和TensorFlow等库。此外,它还建立了关键的环境常数,如图像尺寸和学习率,这对后续分析和模型训练至关重要。#Generalimportosimportkerasimportnumpyasnpimportpandasaspdimporttensorflow......
  • Big-Yellow的算法工程师进阶之路
    Big-Yellow的算法工程师进阶之路一、基础算法二、基础数据结构2.1链表三、......
  • 代码随想录算法训练营第二天| 977.有序数组的平方
    第一题题解首先写了一个初步解,后续再想优化思路classSolution:defsortedSquares(self,nums:List[int])->List[int]:#sortbytheabsofvalueabs_min=10000abs_min_index=0foriinrange(len(nums)):if......
  • 【深度学习】Logistic回归算法和向量化编程。全md文档笔记(代码文档已分享)
    本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经网络图像相关案例。具体......