Wangdao_Ejemplo 11.6 Continuación del proyecto desbloqueado (gráfico de adyacencia de estructura dijkstra)

Personalmente hago algún resumen de esta pregunta.

  • Formas de construir la lista de adyacencia

Construya la estructura de borde Edge, incluyendo hasta y longitud:

struct Edge{
    
    
	int to;
	int length;
	Edge(int t,int l):to(t),length(l){
    
    }
};

Dado que la entrada es: punto a, punto b, longitud d (que representa una ruta de longitud d entre ayb), es un gráfico no dirigido, inherentemente:

vector<Edge>graph[MAXN];//邻接表实现图 定义

cin>>from>>to>>length;
//因为这里是无向图 
graph[from].push_back(Edge(to,length)); 
graph[to].push_back(Edge(to,length));
  • algoritmo dijkstra

Defina la estructura del nodo, incluido el número del punto y la distancia desde el punto hasta el punto de origen:

struct Point{
    
    
	int number;//点的编号 
	int distance;//点到源点的距离 
	Point(int n,int d):number(n),distance(d){
    
    }
	bool operator<(const Point& p)const{
    
    
	return distance>p.distance;
	}
};

El proceso de algoritmo específico es el siguiente, y la cola de prioridad se construye aquí:

void Dijkstra(int s)
{
    
    
	priority_queue<Point> p;//构建优先队列 
	dis[s]=0; 
	p.push(Point(s,dis[s]));//源点 
	while(!p.empty())
	{
    
    
		int u=p.top().number;
		p.pop();
		for(int i=0;i<graph[u].size();++i)//遍历与点u有边相连的点 
		{
    
    
			int v=graph[u][i].to;//和u相连的节点 
			int d=graph[u][i].length;//u到v的长度
			if(dis[v]>dis[u]+d)
			{
    
    	dis[v]=dis[u]+d;
				p.push(Point(v,dis[v]));} 
		}
	}
}

Idea general

Ingrese nm para indicar el número de ciudades y carreteras.
Luego, el formato de las siguientes m líneas son: abd indica que hay una ruta de longitud d de aab,
y luego una línea: st indica la distancia más corta de sa t

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;
const int MAXN=200;
const int INF=INT_MAX;
struct Edge{
    
    
	int to;
	int length;
	Edge(int t,int l):to(t),length(l){
    
    }
};

struct Point{
    
    
	int number;//点的编号 
	int distance;//点到源点的距离 
	Point(int n,int d):number(n),distance(d){
    
    }
	bool operator<(const Point& p)const{
    
    
	return distance>p.distance;
	}
};

vector<Edge>graph[MAXN];//邻接表实现图 
int dis[MAXN];//节点到源点的距离 

void Initial(int n)
{
    
    
	memset(graph,0,sizeof(graph));
	fill(dis,dis+n,INF);
	
}
bool cmp(Point a,Point b)
{
    
    
	return a.distance<b.distance;
 } 
void Dijkstra(int s)
{
    
    
	priority_queue<Point> p;//构建优先队列 
	dis[s]=0; 
	p.push(Point(s,dis[s]));//源点 
	while(!p.empty())
	{
    
    
		int u=p.top().number;
		p.pop();
		for(int i=0;i<graph[u].size();++i)//遍历与点u有边相连的点 
		{
    
    
			int v=graph[u][i].to;//和u相连的节点 
			int d=graph[u][i].length;//u到v的长度
			if(dis[v]>dis[u]+d)
			{
    
    	dis[v]=dis[u]+d;
				p.push(Point(v,dis[v]));} 
		}
	}
}
int main()
{
    
    
	int n,m;//城数 道路数
	while(cin>>n>>m)
	{
    
    
		Initial(n);//初始化
		while(m--)
		{
    
    
			int from,to,length;
			cin>>from>>to>>length;
			//因为这里是无向图 
			graph[from].push_back(Edge(to,length)); 
			graph[to].push_back(Edge(to,length));
		} 
		int s,t;
		cin>>s>>t;//起点和终点
		Dijkstra(s);
		if(dis[t]==INF) cout<<"-1"<<endl;
		else cout<<dis[t]<<endl;
	 } 
	 return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45019830/article/details/115033941
Recomendado
Clasificación