El flujo continuado de Ingeniería (unidad de camino más corto, Dijkstra) (cola de prioridad, la sobrecarga de operadores)

Suavizar Proyecto tráfico promedio

Tiempo límite: 3000/1000 MS (Java / Otros) Límite de memoria: 32768/32768 K (Java / Otros)
sumisión total (s): 87181 admitirá la presentación (s): 33604


 

Descripción del problema

Desde la provincia de buena ejecución del proyecto durante muchos años, finalmente construido muchas carreteras. Pero más no es una forma buena, cada vez de una ciudad a otra, hay muchos tipos de planes de carreteras para elegir, y algunos programas de otros programas, a poca distancia mucho más corta que otros. Esto permite a los peatones con muchos problemas.

Ahora, un punto de partida conocido y el punto final, se calculan desde el principio hasta el final, lo mucho que la distancia más corta necesaria para caminar.

 

 

Entrada

Este tema contiene varios conjuntos de datos, el procesamiento hasta el final del archivo.
Cada línea de prueba contiene dos números enteros positivos N y M (0 <n <200,0 < M <1,000), representa el número de ciudades y el número de carreteras existentes que se han construido. En urbana numerada 0 ~ N-1.
Seguido de M líneas de información de ruta. Cada fila contiene tres enteros A, B, X (0 < = A, B <N, A! = B, 0 <x <10.000), expresado entre las ciudades y urbano A B X una longitud de camino de dos vías.
La siguiente línea seguido por dos números enteros S, T (0 <= S , T <N), que representa los puntos de inicio y de fin.

 

 

Salida

Para cada conjunto de datos, la salida desde el mínimo necesario para caminar en una línea. Si no existe la ruta de S a T, la salida de -1.

 

 

Ejemplo de entrada

3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

Ejemplo de salida

2
-1


 

Autor

Linle

El mayor INT

#include <iostream>
using namespace std;


int MAX_INT = 0x7FFFFFFF;
// 7 代表 0111   F代表1111
// 整个二进制是 0111 1111 1111 1111 1111 1111 1111 1111 

int main() {
	
	cout << MAX_INT << endl; 
	printf("%d", MAX_INT);
	/*
	2147483647
	2147483647
	*/
	
}

Diagrama que muestra la

matriz de adyacencia: Tabla

tabla de Adyacencia: vértice, borde adyacente

 

 

#include <iostream>
#include <queue>
using namespace std;


/* 这个就是邻接表,是图的信息,需要我输入 */
typedef struct Edge {
	int start;
	int end;
	int length;

	Edge(int start, int end, int length) {
		this->start = start;
		this->end = end;
		this->length = length;
	}
	void print() {
		printf("start:%d,end:%d,length""%d\n",start,end,length);
	}

} Edge;

vector<Edge> graph[201]; //index下标表示顶点,内容是vector<Edge> 一堆并列的,没有链接,表示从这个下标index顶点 到别的顶点的边


/*
因为实际情况 我是一圈一圈,把点加到我的s集合里面
我是找下一个 离我s集合最近的点,其实就是离源点最近的点Point,
然后看这个Point 发散出去的路径,是否比我当前路径更优,优化dis。
*/

typedef struct Point {
	int num; // 顶点编号
	int distanceFromStart; //  从开始 到这个点的距离 // 这个属性 唯一的用处 在于q里面排队的时候,前面的是距离小的


	/*
	优先队列的机制 与 sort 不同
	重载小于号,内部需要大于号!!
	优先队列的机制是  遇到true,交换位置
	如果依照sort的写法:重载小于号,内部也是小于号
	   a < b 是我需要的, 这时候返回true,其实他会给他交换位置,最后得到b a  这就交换了位置  不应该。
	如果重载小于号,内部写a > b
	那么 如果遇到 a < b 他返回 false, 结果不交换, 真的就是保持原样了。

	*/
	// 距离小的 优先级高
	// 排在最前面的,其实是数字最小的  一定要注意 这两个符号是相反的
	bool operator < (const Point& a) const { // 一定要加这个const ,总忘了!
		return distanceFromStart > a.distanceFromStart;
	}
	Point(int num, int distance) {
		this->num = num;
		this->distanceFromStart = distance;
	}

} Point;




const int MAX_INT = 99999;  // 把前面的7省了 我怕出错!
const int INF = MAX_INT;
int dis[201]; // 源点到各个顶点的min距离


int n, m;
// 顶点是0 ~ n-1 共n个
// m个边
int u , v;

void dijkstra(int u) {
	/*
	主要任务: 把所有Point装到q里面走一遍
	填充好dis数组
	*/

	priority_queue<Point> q;
	dis[u] = 0; // 我自己到我自己肯定是0
	q.push(Point(u,0));
	while (!q.empty()) {
		int father = q.top().num; // 离u最近的点
//		cout << father << endl;
		q.pop();
		for (int i = 0; i <= graph[father].size() - 1; i ++) {
			int s = graph[father][i].start; // s肯定是father 不用想了
			int e = graph[father][i].end;
			int l = graph[father][i].length;
			if (dis[e] > dis[s] + l) {
				dis[e] = dis[s] + l;
//				cout << "更新成功" << endl;
				q.push(Point(e,dis[e])); 	// 一定写在括号内,只有更新成功的 才加入q
			}

		}
	}
	return ;
}


void print() {
	cout << "graph" << endl;
	for (int i = 0; i <= n-1; i ++) {
		cout << "index:" << i << endl;
		for (int j = 0; j <= graph[i].size() - 1; j++) {
			graph[i][j].print();
		}

	}
}


int main() {

	while(cin >> n >> m) {
		// 图初始化  没有边
		// 初始情况: 每条最短路径都是INF
		for(int i = 0; i <= n-1; i++) {
			graph[i].clear();
		}
		for (int i = 0; i <= n-1; i++) {
			dis[i] = INF;
		}

		int start, end , length;
		while(m--) {
			cin >> start >> end >> length;
			graph[start].push_back(Edge(start,end,length));
			graph[end].push_back(Edge(end,start,length));
		}

//		print();  // 经验证,没问题
		cin >> u >> v; // 我要找的是 u 到 v的最短路径

		dijkstra(u);
		if (dis[v] == INF) {
			cout << -1 << endl;
		} else {
			cout << dis[v] << endl;
		}
	}


}
#include <iostream>
#include <queue>
#include <vector>
using namespace std;


/*图*/
typedef struct Edge {
	int s; // start
	int e; // end
	int l; // lengh

	Edge(int s,int e, int l) {
		this->s = s;
		this->e = e;
		this->l = l;
	}
} Edge;

vector<Edge> graph[201];

/* s集合,距离表*/
typedef struct Point {
	int num; // 这个点的编号
	int distanceFromStart; // 距离源点的距离

	// 让 distance最小的 排在前面
	bool operator < (const Point& a) const {
		return distanceFromStart > a.distanceFromStart;
	}
	Point(int n,int d) {
		this->num = n;
		this->distanceFromStart = d;
	}
} Point;

int INF = 99999;
int dis[201];

int n, m; // 图的信息  0 - n-1编号 ; m个边
int u, v; // 起点 终点

void dijkstra(int u) {
	priority_queue<Point> q;
	dis[u] = 0;
	q.push(Point(u,0));
	while (!q.empty()) {
		int father = q.top().num;
//		cout << father << endl;
		q.pop();
		for (int i = 0; i <= graph[father].size() - 1; i++) {
			int s = graph[father][i].s;
			int e = graph[father][i].e;
			int l = graph[father][i].l;
			if (dis[e] > dis[s] + l) {
				dis[e] = dis[s] + l;
				q.push(Point(e,dis[e]));
			}

		}

	}
	return ;
}



int main() {
	while (cin >> n >> m) {
		// 初始信息 ok
		for (int i = 0; i <= n-1; i++) {
			graph[i].clear();
		}
		for (int i = 0; i <= n-1; i++) {
			dis[i] = INF;
		}

		//输入 ok
		int s, e, l;
		while(m --) {
			cin >> s >> e >> l;
			graph[s].push_back(Edge(s, e, l));
			graph[e].push_back(Edge(e, s, l));
		}

		// 计算好dis数组
		cin >> u >> v;
		dijkstra(u);
		if (dis[v] == INF) {
			cout << -1 << endl;
		} else {
			cout << dis[v] << endl;
		}

	}



}

 

发布了126 篇原创文章 · 获赞 2 · 访问量 6326

Supongo que te gusta

Origin blog.csdn.net/bijingrui/article/details/105373533
Recomendado
Clasificación