王道机试指南—第11章图论—11.4最短路径
Dijkstra
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<climits>
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) {} //构造函数
};
vector<Edge> graph[MAXN]; //使用向量数组表示邻接表,用向量数组的下标表示from
int dis[MAXN]; //表示顶点到所有点的最短路径长度
bool visit[MAXN];
void Dijkstra(int start,int n){ //起点和顶点个数
memset(visit,false,sizeof(visit));
fill(dis,dis+n,INF);
dis[start]=0;
for(int i=0;i<n;i++){
int u=-1;
for(int j=0;j<n;j++){
if(visit[j]){
continue;
}
if(u==-1||dis[j]<dis[u]){
u=j;
}
}
for(int j=0;j<graph[u].size();j++){
int v=graph[u][j].to;
int d=graph[u][j].length;
if(dis[u]+d<dis[v]){
dis[v]=dis[u]+d;
}
}
visit[u]=true;
}
return;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(graph,0,sizeof(graph));
while(m--){
int from,to,length;
scanf("%d%d%d",&from,&to,&length);
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(from,length));
}
int start;
int terminal;
scanf("%d%d",&start,&terminal);
Dijkstra(start,n);
if(dis[terminal]==INF){
dis[terminal]=-1;
}
printf("%d\n",dis[terminal]);
}
return 0;
}
Dijkstra优化
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<climits>
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]; //使用向量数组表示邻接表,用向量数组的下标表示from
int dis[MAXN]; //表示顶点到所有点的最短路径长度
void Dijkstra(int start,int n){ //起点和顶点个数
fill(dis,dis+n,INF);
dis[start]=0;
priority_queue<Point> myPriorityQueue;
myPriorityQueue.push(Point(start,dis[start]));
while(!myPriorityQueue.empty()){
int u=myPriorityQueue.top().number;
myPriorityQueue.pop();
for(int j=0;j<graph[u].size();j++){
int v=graph[u][j].to;
int d=graph[u][j].length;
if(dis[u]+d<dis[v]){
dis[v]=dis[u]+d;
myPriorityQueue.push(Point(v,dis[v]));
}
}
}
return;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(graph,0,sizeof(graph));
while(m--){
int from,to,length;
scanf("%d%d%d",&from,&to,&length);
graph[from].push_back(Edge(to,length));
graph[to].push_back(Edge(from,length));
}
int start;
int terminal;
scanf("%d%d",&start,&terminal);
Dijkstra(start,n);
if(dis[terminal]==INF){
dis[terminal]=-1;
}
printf("%d\n",dis[terminal]);
}
return 0;
}