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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值