Dijkstra+堆优化+邻接表

在PAT试题中涉及到10000个数据左右的最短路问题时,对迪杰斯特拉算法用最小堆进行优化可以在很快时间内解决。如果不采用迪杰斯特拉算法和邻接表表示则很有可能超时。下面展示了用c++中stl的优先级队列对迪杰斯特拉算法的优化,有了它加上DFS就可以基本解决在PAT中遇到的最短路问题(大部分最短路问题顶点不超过1000,但有时候出现10000时用下面的这个模板也能从容面对。)

struct Node{
	int v, dis;//v代表顶点,dis代表边权 
};
vector<Node> Adj[maxn];//图的邻接表示法 
struct HeapNode{
	int v,d;//v代表图中点,d代表源点到v的当前的最短距离 
	HeapNode(){}
	HeapNode(int V, int D){v=V; d=D;}
	friend bool operator < (HeapNode v1, HeapNode v2){//为使用优先级队列做准备 
		return v1.d > v2.d;
	}
};
bool vis[maxn] = {false};
int d[maxn];//源点到该点的最短距离 
void Dijkstra(int s)
{
	priority_queue<HeapNode> q;//优先级队列 
	fill(d,d+maxn,inf);
	d[s] = 0;
	q.push(HeapNode(s,0));
	while(!q.empty()){
		int u;
		u = q.top().v;q.pop();
		for(int j=0; j<Adj[u].size(); j++){
			int v = Adj[u][j].v;
			if(vis[v]==false){
				if(d[u]+Adj[u][j].dis<d[v]){
					d[v] = d[u]+Adj[u][j].dis;
					q.push(HeapNode(v,d[v]));
					pre[v].clear();
					pre[v].push_back(u);
				}
				else if(d[u]+Adj[u][j].dis==d[v]){
					pre[v].push_back(u);
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/yiwaite/article/details/106197181