#include "iostream"
#include "vector"
#include "string.h"
#include "fstream"
#include "queue"
#include "stdio.h"
using namespace std;
const int MAX_V = 100;
const int INF = 10000;
int V; //顶点数
int dist[MAX_V];
int visit[MAX_V];
struct Edge
{
int to;
int cost;
};
vector<Edge> G[MAX_V];
typedef pair<int, int> P; //first为距离,second为顶点编号
priority_queue<P, vector<P>, greater<P> > q;
void addEdge(int from, int to, int cost)
{
Edge e;
e.to = to;
e.cost = cost;
G[from].push_back(e);
Edge e1;
e1.to = from;
e1.cost = cost;
G[to].push_back(e1);
}
void Dijkstra(int s)
{
dist[s] = 0;
q.push(P(0, s));
while(!q.empty())
{
P p = q.top(); //从尚未使用的顶点中找到一个距离最小的顶点
q.pop();
int v = p.second;
if(dist[v] < p.first)
continue;
for(int i=0; i<G[v].size(); i++) //顶点e.to经过该顶点后距离变小,则更改e.to的距离
{
Edge e = G[v][i];
if(dist[e.to] > dist[v] + e.cost)
{
dist[e.to] = dist[v] + e.cost;
q.push(P(dist[e.to], e.to));
}
}
}
}
int main()
{
V = 7;
//A B C D E F G
//1 2 3 4 5 6 7
addEdge(1, 2, 2);
addEdge(1, 3, 5);
addEdge(2, 3, 4);
addEdge(2, 4, 6);
addEdge(2, 5, 10);
addEdge(3, 4, 2);
addEdge(4, 6, 1);
addEdge(5, 6, 3);
addEdge(5, 7, 5);
addEdge(6, 7, 9);
fill(dist, dist+V+1, INF);
Dijkstra(1);
cout << "顶点A到各顶点的最短距离为:" << endl;
for(int i=2; i<=V; i++)
{
printf("%c---%c:%d\n", 'A', 'A' + i - 1, dist[i]);
}
cout << endl;
return 0;
}
单源最短路径---Dijkstra
最新推荐文章于 2021-09-06 21:49:32 发布