关于Dijkstra中标记位置的疑问
查看原帖
关于Dijkstra中标记位置的疑问
1112330
hczyy楼主2025/8/2 20:11
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
#define LL long long

struct Node{
	int to, w;
	bool operator<(const Node &a)const{
		return w > a.w;	
	}
};

int n, m, s, dis[N];
vector<Node>edges[N];
bool flag[N]; 

priority_queue<Node>q;

void Dijkstra(){
	for(int i = 0; i <= n; i++) dis[i] = INT_MAX;
	dis[s] = 0;
	q.push({s, 0});
	while(q.size()){
		int u = q.top().to;
		q.pop();
		if(flag[u]) continue;
		flag[u] = true;
		for(int i = 0; i < edges[u].size(); i++){
			int v = edges[u][i].to, w = edges[u][i].w;
			if(dis[u] + w < dis[v]){
				dis[v] = dis[u] + w;
				q.push({v, dis[v]}); 
			}
		}
	}
	for(int i = 1; i <= n; i++){
		cout << dis[i] << " ";
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m >> s;
	for(int i = 1; i <= m; i++){
		int u, v, w;
		cin >> u >> v >> w;
		edges[u].push_back({v, w});
	}
	Dijkstra();
	return 0; 
}

上面这一篇是AC code 但与下面这一个只T一个点的code只差一行

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
#define LL long long

struct Node{
	int to, w;
	bool operator<(const Node &a)const{
		return w > a.w;	
	}
};

int n, m, s, dis[N];
vector<Node>edges[N];
bool flag[N]; 

priority_queue<Node>q;

void Dijkstra(){
	for(int i = 0; i <= n; i++) dis[i] = INT_MAX;
	dis[s] = 0;
	q.push({s, 0});
	while(q.size()){
		int u = q.top().to;
		q.pop();
		flag[u] = true;
		for(int i = 0; i < edges[u].size(); i++){
			int v = edges[u][i].to, w = edges[u][i].w;
			if(!flag[v] && dis[u] + w < dis[v]){
				dis[v] = dis[u] + w;
				q.push({v, dis[v]}); 
			}
		}
	}
	for(int i = 1; i <= n; i++){
		cout << dis[i] << " ";
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m >> s;
	for(int i = 1; i <= m; i++){
		int u, v, w;
		cin >> u >> v >> w;
		edges[u].push_back({v, w});
	}
	Dijkstra();
	return 0; 
}

也就是第一篇的26行和第二篇的29行 为什么flag数组的标记位置会有影响 按道理来说其实没有flag数组也没有影响吗 毕竟标记过后应该是保证最优解的啊 求dalao可以解惑 悬赏一个关注

2025/8/2 20:11
加载中...