社区讨论

SPFA超时求解

P1629邮递员送信参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@m5izfrlc
此快照首次捕获于
2025/01/05 10:17
去年
此快照最后确认于
2025/11/04 11:57
4 个月前
查看原帖

代码如下:

CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0;
struct node
{
	int to,value;
};
vector<node> maps[1145140];
int dis[1145140];
bool book[1145140];
queue<int> q;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
    	int u;
    	node v;
    	scanf("%d%d%d",&u,&v.to,&v.value);
    	maps[u].push_back(v);
	}
	for(int i=2;i<=n;i++)
	{
		while(!q.empty()) q.pop();
		memset(dis,63,sizeof dis);
		memset(book,false,sizeof book);
		dis[1]=0,book[1]=true;
		q.push(1);
		while(!q.empty())
		{
			int u=q.front();
			book[u]=false;
			for(int j=0;j<maps[u].size();j++)
			{
				node v=maps[u][j];
				if(dis[v.to]>dis[u]+v.value)
				{
					dis[v.to]=dis[u]+v.value;
					if(book[v.to]==false)
					{
						book[v.to]=true;
						q.push(v.to);
				    }
				}
			}
			q.pop();
		}
		ans+=dis[i];
		while(!q.empty()) q.pop();
		memset(dis,63,sizeof dis);
		memset(book,false,sizeof book);
		dis[i]=0,book[i]=true;
		q.push(i);
		while(!q.empty())
		{
			int u=q.front();
			book[u]=false;
			for(int j=0;j<maps[u].size();j++)
			{
				node v=maps[u][j];
				if(dis[v.to]>dis[u]+v.value)
				{
					dis[v.to]=dis[u]+v.value;
					if(book[v.to]==false)
					{
						book[v.to]=true;
						q.push(v.to);
					}
				}
			}
			q.pop();
		}
		ans+=dis[1];
	}
	printf("%d\n",ans);
	return 0;
}

样例能过,超时三个点,谁能解释一下?

回复

6 条回复,欢迎继续交流。

正在加载回复...