Dijkstra 优先队列优化

struct ac{ 
	int v,dis;
	ac(){}
	ac(int _v,int _dis):v(_v),dis(_dis){}
	bool operator < (const ac& x)const{
		if(dis==x.dis)
			return v>x.v;
		return dis>x.dis;
	}
};
vector<ac>Adj[maxn];

void Dijkstra(int v0){
	memset(d,INF,sizeof(d));
	d[v0] = 0;
	priority_queue<ac>q;
	q.push(ac(v0,d[v0]));
	while(!q.empty()){
		ac t = q.top();q.pop();
		for(int i=0;i<Adj[t.v].size();i++){
			ac tt = Adj[t.v][i];
			if(d[tt.v]>t.dis+tt.dis){
				d[tt.v] = t.dis + tt.dis;
				q.push(ac(tt.v,d[tt.v]));
			}
		}
	}
}

Dijkstra算法是一种用于寻找中两点之间最短路径的经典算法,通常会利用优先队列(如二叉堆)来优化搜索过程。在C++中,我们可以使用`std::priority_queue`来实现这个数据结构。下面是一个简化版的Dijkstra算法使用优先队列的示例: ```cpp #include <iostream> #include <vector> #include <queue> #include <limits> struct Node { int id; int dist; bool visited; Node(int _id, int _dist) : id(_id), dist(_dist), visited(false) {} bool operator<(const Node& other) const { return dist < other.dist; } }; void dijkstra(std::vector<std::pair<int, int>>& graph, int start) { std::priority_queue<Node> pq; std::vector<int> dist(graph.size(), std::numeric_limits<int>::max()); dist[start] = 0; pq.push(Node(start, 0)); while (!pq.empty()) { Node current = pq.top(); pq.pop(); if (current.visited) continue; current.visited = true; for (auto [neighbor, weight] : graph[current.id]) { int new_dist = current.dist + weight; if (new_dist < dist[neighbor]) { dist[neighbor] = new_dist; pq.push(Node(neighbor, new_dist)); } } } // 打印结果 for (int i = 0; i < graph.size(); ++i) { if (dist[i] != std::numeric_limits<int>::max()) std::cout << "Node " << i << ": Shortest distance from start is " << dist[i] << std::endl; } } // 使用示例 int main() { std::vector<std::pair<int, int>> graph = {{0, 4}, {1, 2}, {2, 7}, {3, 9}, {3, 14}, {4, 10}, {5, 1}, {6, 2}}; dijkstra(graph, 0); return 0; } ``` 在这个例子中,我们首先创建一个`Node`结构体表示中的每个节点,包含ID、距离值和访问标志。然后,我们使用`std::priority_queue`存储待处理的节点,并按照距离值排序。在每次循环中,我们会选择距离最近未访问过的节点,并更新其相邻节点的距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值