链式前向星+dijkstra
#include<iostream>
#include<vector>
using namespace std;
const int N = 1000;
struct {
int to;
int w;
int next;
}edge[N];
int head[N];
void add_edge(int u,int v,int w){
static int cnt = 0;
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
vector<int> dijkstra(int start,int end,int n){
vector<bool> f(n,false);
vector<int> dis(n,INT_MAX);
vector<int> parent(n,-1);
dis[start] = 0;
for(int i=0;i<n;i++){
int select_vertex = -1;
int min_dis = INT_MAX;
for(int j=0;j<n;j++){
if(!f[j] && dis[j]<min_dis){
select_vertex = j;
min_dis = dis[j];
}
}
if(select_vertex==-1) break;
f[select_vertex] = true;
for(int p=head[select_vertex];p!=-1;p=edge[p].next){
int d = dis[select_vertex] + edge[p].w;
int next_vertex = edge[p].to;
if(d < dis[next_vertex]){
dis[next_vertex] = d;
parent[next_vertex] = select_vertex;
}
}
}
vector<int> path;
path.reserve(n);
for(int v = end;v!=-1;v=parent[v]){
path.push_back(v);
}
return path;
}
int main(){
fill(head,head+N,-1);
add_edge(0,1,1);
add_edge(1,2,2);
add_edge(2,3,1);
add_edge(3,4,1);
add_edge(5,6,1);
for(auto v:dijkstra(0,6,7)){
cout << v << " ";
}
return 0;
}
“热爱是所有的理由和答案”。