求助站外题dijkstra过了spfa不能过(悬关
  • 板块学术版
  • 楼主icaijy
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/24 20:57
  • 上次更新2024/8/25 06:23:11
查看原帖
求助站外题dijkstra过了spfa不能过(悬关
378195
icaijy楼主2024/8/24 20:57

在同一道题目中用dijkstra能ac,用spfa有些点只对了一半(最短路对了最短路计数错了),这是为什么?

void dijkstra(int start,int* ans,int* ways){
	pair<int,int> pqf;
	memset(in,0,sizeof(in));
	for (int i=1;i<=n;i++) if (i!=start) ans[i]=1145141919810;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
	pq.push(make_pair(0,start));
	ways[start]=1;
	while (!pq.empty()){
		pqf=pq.top();
		pq.pop();
		if (in[pqf.second]) continue;
		in[pqf.second]=1;
		for (auto i:adj[pqf.second]){
			if (ans[i.second]==pqf.first+i.first) {
				ways[i.second]+=ways[pqf.second];
			}
			else if (ans[i.second]>pqf.first+i.first){
				ways[i.second]=ways[pqf.second];
				ans[i.second]=pqf.first+i.first;
				pq.push(make_pair(pqf.first+i.first,i.second));
			}
			ways[i.second]%=MOD;
		}
	}
}
 
void spfa(int start,int* ans,int* ways){
	memset(in,0,sizeof(in));
	for (int i=1;i<=n;i++) if (i!=start) ans[i]=1145141919810;
	queue<int> q;
	ways[start]=1;
	q.push(start);
	int qf;
	while (!q.empty()){
		qf=q.front();
		q.pop();
		in[qf]=0;
		for (auto i:adj[qf]){
			if (ans[i.second]>ans[qf]+i.first) {
				ans[i.second]=ans[qf]+i.first;
				ways[i.second]=ways[qf];
				if (!in[i.second]) {
					in[i.second]=1;
					q.push(i.second);
				}
			}
			else if (ans[i.second]==ans[qf]+i.first) ways[i.second]+=ways[qf];
			ways[i.second]%=MOD;
		}
	}
}
2024/8/24 20:57
加载中...