Dijkstra + optimización de montón + lista de adyacencia

Cuando el problema de la ruta más corta de aproximadamente 10,000 datos está involucrado en la prueba PAT, el algoritmo de Dijkstra se puede resolver en muy poco tiempo optimizando el montón mínimo. Si no se utilizan el algoritmo de Dijkstra y la representación de la tabla de adyacencia, es probable que se agote el tiempo de espera. A continuación se muestra la optimización del algoritmo de Dijkstra con la cola de prioridad de stl en c ++. Con él y DFS, el problema de la ruta más corta encontrado en PAT se puede resolver básicamente (la mayoría de los vértices de la ruta más corta no exceden 1000 , Pero a veces, cuando hay 10000, la siguiente plantilla también se puede usar con calma).

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

 

 

 

Supongo que te gusta

Origin blog.csdn.net/yiwaite/article/details/106197181
Recomendado
Clasificación