在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);
}
}
}
}
}