Dijkstra算法:求单源最短路径的算法
题干
C++实现
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct Edge {
int u;
int v;
int weight;
Edge(int _u,int _v,int _weight) {
u = _u;
v = _v;
weight = _weight;
}
};
vector<Edge> graph[300];
struct PQueueNode {
int u;
int distance;
PQueueNode(int _u,int _distance) {
u = _u;
distance = _distance;
}
};
bool operator<(PQueueNode lhs,PQueueNode rhs) {
return lhs.distance > rhs.distance;
}
int Dijkstra(int s,int t) {
priority_queue<PQueueNode> pqueue;
int distance[300];
int isVisited[300];
for(int i = 0; i<300; i++) {
distance[i] = -1;
isVisited[i] = false;
}
distance[s] = 0;
PQueueNode qnode(s,0);
pqueue.push(qnode);
while(pqueue.empty() == false) {
int u = pqueue.top().u;
pqueue.pop();
if(isVisited[u] == true) {
continue;
}
isVisited[u] = true;
for(int i = 0; i<graph[u].size(); ++i) {
int v = graph[u][i].v;
int weight = graph[u][i].weight;
if(distance[v] == -1 || distance[v] > distance[u] + weight) {
distance[v] = distance[u] + weight;
PQueueNode next(v,distance[v]);
pqueue.push(next);
}
}
}
return distance[t];
}
int main() {
int n,m;
while(scanf("%d%d",&n,&m) != EOF) {
for(int i = 0; i<n; ++i) {
graph[i].clear();
}
for(int i = 0; i < m; ++i) {
int u,v,weight;
scanf("%d%d%d",&u,&v,&weight);
Edge e1(u,v,weight);
graph[u].push_back(e1);
Edge e2(v,u,weight);
graph[v].push_back(e2);
}
int s,t;
scanf("%d%d",&s,&t);
printf("%d\n",Dijkstra(s,t));
}
return 0;
}