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 @ 2024-02-25 18:41  ltign  阅读(12)  评论(0)    收藏  举报