0
点赞
收藏
分享

微信扫一扫

【第三天】spfa算法

Ewall_熊猫 2022-03-23 阅读 58

 我根据算法书里面的写法改的(因为我还不会链式前向星存储图。。。。。)

#include<bits/stdc++.h>
using namespace std;
#define MAX 10000001
#define inf 0x3f3f3f
int n, m;
bool flag = true;
int edge[1001][1001], dis[MAX], sum[MAX],vis[MAX];
//sum记录负回环,vis[]记录该节点是否在队列中
void spfa(int i)
{
	queue<int>a;
	vis[i] = 1;
	sum[i]++;
	a.push(i);
	while (!a.empty())
	{
		int i = a.front();
		vis[i] = 0;
		for (int j = 1; j <= n; j++)
		{
			if (dis[j] > dis[i] + edge[i][j])
			{
				dis[j] = dis[i] + edge[i][j];
				if (!vis[j])
				{
					vis[j] = 1;
					if (++sum[j] >=n)
					{
						flag = false;
						return;
					}
					a.push(j);
				}
			}
		}
		a.pop();
	}
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			edge[i][j] = inf;
	for (int i = 1; i <= n; i++)
		dis[i] = inf;
	dis[1] = 0;
	for (int i = 1; i <= m; i++)
	{
		int a, b, c;
		cin >> a >> b >> c;
		edge[a][b] = c;
	}
	spfa(1);
	for (int i = 1; i <= n; i++)
	{
		if (dis[i] == inf)
		{
			cout << "NO" << " ";
			continue;
		}
		cout << dis[i] << " ";
	}
		return 0;
}

bool spfa(int u)
{
	queue<int>q;
	memset(vis, 0, sizeof(vis));
	memset(sum, 0, sizeof(sum));
	memset(dis, 0x3f, sizeof(dis));
	vis[u] = 1;
	dis[u] = 0;
	sum[u]++;
	q.push(u);
	while (!q.empty())
	{
		int x =q.front();
		q.pop();
		vis[x] = 0;
		for (int i = head[i]; ~i; i++)
		{
			int v = e[i].to;
			if (dis[v] > dis[x] + e[i].w)
			{
				dis[v] = dis[x] + e[i].w;
				if (!vis[v])
				{
					if (++sum[v] >= n)
						return false;
					vis[v] = 1;
					q.push(v);
				}
			}
		}
	}
	return false;
}

《算法训练营》里面的写法

举报

相关推荐

#第三天

第三天学习

Hive第三天

Ajax第三天

防御第三天

RHCA第三天

第三天打卡

【JavaSE 第三天】

0 条评论