SPFA算法

一、单源最短路径

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 (cnt[e.to] >= n)
						return true;
				}
			}
		}
	}
	return false;
}

posted @   ltign  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示