dijkstra + estrella de avance de cadena + optimización de cola de prioridad

Tarjetas de invitación POJ - 1511

Descripción
n-1 individuos comienzan desde el punto 1 hasta los n-1 puntos de propaganda restantes, y luego regresan al punto 1 para informar los resultados y encontrar la suma mínima de todas las rutas de ida y vuelta.

La entrada de
entrada consta de T casos. La primera línea de entrada contiene solo el entero positivo T.
Los siguientes son N y M, 1 <= N, M <= 1000000, lo que significa N puntos y M bordes que conectan N puntos.
Luego hay M filas, cada fila incluye tres valores U, V, W, lo que indica que la distancia del punto U al punto V requiere W. Puede asumir que la gráfica está conectada.
¡Tenga en cuenta que es un canal unidireccional! ! !

Salida
Para cada caso, imprima una línea, indicando el valor mínimo de la ruta total.

Entrada de muestra
2
2 2
1 2 13
2 1 33
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50

Salida de muestra
46
210

** Pensamiento: ** La pregunta nos permite encontrar el valor mínimo de la ruta de ida y vuelta más corta. Puede usar dijkstra para encontrar las direcciones de avance y retroceso y sumarlas.
** Nota: ** El rango de datos de la pregunta es demasiado grande. Usar la matriz de adyacencia para guardar el gráfico definitivamente será T, por lo que elegimos usar el mapa de almacenamiento de estrellas en cadena hacia adelante feroz) pero lo que no esperábamos es- -, dijkstra no usó optimización de cola de prioridad o T, fue descuidado, y luego usó cola de prioridad + pase de estrella de avance de cadena - El
código de CA es el siguiente:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<map>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<cctype>
#include<string>
#include<stdexcept>
#include<fstream>
#include<sstream>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 10000007
#define debug() puts("what the fuck!")
#define dedebug() puts("what the fuck!!!")
#define ll long long
#define ull unsigned long long
#define speed {
    
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); };
using namespace std;
const double PI = acos(-1.0);
const int maxn = 1e6 + 50;
const int N = 35;
const int INF = 0x3f3f3f3f;
const int inf = 0xfffffff;//比INF小,防止累加爆int
const double esp_0 = 1e-6;
const double gold = (1 + sqrt(5)) / 2;
int gcd(int x, int y) {
    
    
	return y ? gcd(y, x % y) : x;
}
int n, m;
int flag;
struct node {
    
    
	int next, to, w;
}edge[maxn],redge[maxn];
int head[maxn], rhead[maxn], cnt, rcnt;
int dis[maxn], rdis[maxn], vis[maxn];
void add(int u, int v, int w) {
    
    
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	edge[cnt].w = w;
	head[u] = cnt++;
}
void radd(int u, int v, int w) {
    
    
	redge[rcnt].to = v;
	redge[rcnt].next = rhead[u];
	redge[rcnt].w = w;
	rhead[u] = rcnt++;
}
void init() {
    
    
	mem(dis, INF);
	mem(rdis, INF);
	mem(head, -1);
	mem(rhead, -1);
}
struct que {
    
    
	int id, dist;
	que() {
    
    };
	que(int id, int dist) :id(id), dist(dist) {
    
    };
	bool operator<(const que& a)const{
    
    
		return dist > a.dist;
	}

};
void dijkstra(int dis[],int head[],node edge[]) {
    
    
	mem(vis, 0);
	dis[1] = 0;
	priority_queue<que>q;
	q.push(que(1, dis[1]));
	while (!q.empty()) {
    
    
		que step = q.top();
		q.pop();
		if (vis[step.id])continue;
		vis[step.id] = 1;
		for (int i = head[step.id]; i != -1; i = edge[i].next) {
    
    
			int value = edge[i].to;
			if (!vis[value] && dis[value] > dis[step.id] + edge[i].w) {
    
    
				dis[value] = dis[step.id] + edge[i].w;
				q.push(que(value, dis[value]));
			}
		}
	}
}
int main() {
    
    
	int t;
	scanf("%d", &t);
	while (t--) {
    
    
		init();
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= m; ++i) {
    
    
			int u, v, w;
			scanf("%d%d%d", &u, &v, &w);
			add(u, v, w);
			radd(v, u, w);
		}
		dijkstra(dis,head,edge);
		dijkstra(rdis, rhead,redge);
		ll ans = 0;
		for (int i = 1; i <= n; ++i) {
    
    
//			printf("%d %d\n", dis[i], rdis[i]);
			ans += dis[i] + rdis[i];
		}
		printf("%lld\n", ans);
	}
	return 0;
}

Códigos de error no optimizados con cola de prioridad

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<map>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<set>
#include<cctype>
#include<string>
#include<stdexcept>
#include<fstream>
#include<sstream>
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 10000007
#define debug() puts("what the fuck!")
#define dedebug() puts("what the fuck!!!")
#define ll long long
#define ull unsigned long long
#define speed {
    
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); };
using namespace std;
const double PI = acos(-1.0);
const int maxn = 1e6 + 50;
const int N = 35;
const int INF = 0x3f3f3f3f;
const int inf = 0xfffffff;//比INF小,防止累加爆int
const double esp_0 = 1e-6;
const double gold = (1 + sqrt(5)) / 2;
int gcd(int x, int y) {
    
    
	return y ? gcd(y, x % y) : x;
}
int n, m;
struct node {
    
    
	int next, to, w;
}edge[maxn],redge[maxn];
int head[maxn], rhead[maxn], cnt, rcnt;
int dis[maxn], rdis[maxn], vis[maxn];
void add(int u, int v, int w) {
    
    
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	edge[cnt].w = w;
	head[u] = cnt++;
}
void radd(int u, int v, int w) {
    
    
	redge[rcnt].to = v;
	redge[rcnt].next = rhead[u];
	redge[rcnt].w = w;
	rhead[u] = rcnt++;
}
void init() {
    
    
	mem(dis, INF);
	mem(rdis, INF);
	mem(head, -1);
	mem(rhead, -1);
}
void dijkstra(int dis[],int head[],node edge[]) {
    
    
	mem(vis, 0);
	dis[1] = 0;
	for (int i = 1; i <= n; ++i) {
    
    
		int min = INF;
		int step = -1;
		for (int j = 1; j <= n; ++j) {
    
    
			if (!vis[j] && min > dis[j]) {
    
    
				min = dis[j];
				step = j;
			}
		}
		if (step == -1)break;
		vis[step] = 1;
		for (int i = head[step]; i != -1; i = edge[i].next) {
    
    
			int now = edge[i].to;
			if (dis[now] > dis[step] + edge[i].w) {
    
    
				dis[now] = dis[step] + edge[i].w;
			}
		}
	}
}
int main() {
    
    
	int t;
	scanf("%d", &t);
	while (t--) {
    
    
		init();
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= m; ++i) {
    
    
			int u, v, w;
			scanf("%d%d%d", &u, &v, &w);
			add(u, v, w);
			radd(v, u, w);
		}
		dijkstra(dis,head,edge);
		dijkstra(rdis, rhead,redge);
		ll ans = 0;
		for (int i = 1; i <= n; ++i) {
    
    
//			printf("%d %d\n", dis[i], rdis[i]);
			ans += dis[i] + rdis[i];
		}
		printf("%lld\n", ans);
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_40924271/article/details/107763277
Recomendado
Clasificación