SPFA超时
  • 板块学术版
  • 楼主TARGETMINE
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/10/8 21:29
  • 上次更新2023/11/2 14:52:31
查看原帖
SPFA超时
935263
TARGETMINE楼主2023/10/8 21:29

https://www.luogu.com.cn/record/128336776

// P1359 租用游艇 spfa
// 链式前向星的SPFA 

#include <iostream>
#include <cstring>

using namespace std;

const int N=100000, INF = 0x3f3f3f3f;

int h[N], e[N], w[N], nex[N], idx;// 数组模拟的链表 
int dist[N]; // 距离数组
bool vis[N]; // 是否访问
int n, m;

void add(int a, int b, int v)
{
	e[idx] = b;
	w[idx] = v;
	nex[idx] = h[a];
	h[a] = idx;
	idx++;

 } 

int spfa(int start, int end)
{
	memset(dist, INF, sizeof(dist));
	
	int que[N], f=0, t=0;
	que[++t] = start;	// 入队列 
	dist[start] = 0;	// 距离 
	vis[start] = 1;	// start点添加到队列
	while (f<t)
	{

		int k = que[f+1];
		vis[k] = 0;
		
		for (int i=h[k];i!=-1;i=nex[i])
		{
			int temp = e[i];	// 点
			int val = w[i];	// 权值 
		
			// 判断k加入是否可以更新队列
			if (dist[temp] > dist[k]+val)
			{
				dist[temp] = dist[k]+val;
				if (!vis[temp])
				{
					que[++t] = temp;
					vis[temp] = true;
				}
				
				
			}
		}
		
		f++; // 出队列 
		
	}
	
	
	return dist[end] == INF ? -1 : dist[end];
}


int main()
{
	int a, b, w; // w为权值 
	
	cin >> n >> m;
	
	memset(h, -1, sizeof(h));
	
	for (int i=1;i<=m;i++)
	{

		cin >> a >> b >> w;
		add(a, b, w);


	}	
	
	int t = 0;
	for (int i=2;i<=n;i++)
	{
		memset(vis, 0, sizeof(vis));
		t += spfa(1, i);
		memset(vis, 0, sizeof(vis));
		t += spfa(i, 1);
	}
	


	cout << t;

	
	return 0;
}

球调,难道要用dij?

2023/10/8 21:29
加载中...