Prioridad dijkstra optimización de colas (por primera vez de nuevo)

Ahhhhhhhhhhh, los bloggers han roto, y casi toda la noche sin dormir no es una buena cosa Asociado

 Dijkstra buscando el camino más corto cada vez que necesita para tomar la corriente mínima dist actualizada en, por lo que puede utilizar la parte superior de un pequeño montón, manteniendo el valor de la matriz dist, me aburro viendo la televisión, trate de escribir, wa, el cambio mirada, wa, entonces el cambio, wa, nada ah mal, vuelve a intentarlo, WA , tenga en cuenta el orden debe mantenerse a un pequeño alto valor dist del montón, sino también registrar qué punto es esto, es posible utilizar una estructura.

Miré y miré, cambiado y cambiado, me encontrado directamente al punto en la cola de prioridad, de acuerdo con el tamaño del punto (1,2 ,,) colocado, es sin duda en el GG.

Voy a abrir una clasificación especial, registrar el código Qaq tonto de mí en esos días escribió

Coloque el código (a la derecha):

/**
 * Author : correct
 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#define mem(a, b) memset(a, b, sizeof a)
using namespace std;
const int M = 6210 * 2, N = 2520;
int head[M], nex[M], to[M], cnt, ed[M];
void add(int a, int b, int c){
	to[++cnt] = b;
	nex[cnt] = head[a];
	head[a] = cnt;
	ed[cnt] = c;
}
int n, m, s, t;
int dist[N];
bool vis[N];
struct p{
	int x, dist;
	bool operator < (const p& a)const{
		return this->dist < a.dist;
	}
	bool operator > (const p& b)const{
		return this->dist > b.dist;
	}
	p(){

	}
	p(int x, int dist){
		this->x = x;
		this->dist = dist;
	}
};
priority_queue<p, vector<p>, greater<p> > q;
int main()
{
	mem(head, -1);
	mem(nex, -1);
	cnt = 0;
	mem(dist, 0x3f);
	mem(vis, 0);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> s >> t;
	dist[s] = 0;
	q.push(p(s, 0));
	while (m--){
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
		add(b, a, c);
	}
	while (q.size()){
		p T = q.top();
		int ind = T.x;
		q.pop();
		if (vis[ind]){
			continue;
		}
		vis[ind] = 1;
		for (int i = head[ind]; ~i; i = nex[i]){
			int y = to[i];
			int c = ed[i];
			if (dist[y] > dist[ind] + c){
				dist[y] = dist[ind] + c;
				q.push(p(y, dist[y]));
			}
		}
	}
	cout << dist[t];
	return 0;
}

 

Publicados 204 artículos originales · elogios ganado 13 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_43701790/article/details/104831693
Recomendado
Clasificación