链式前向星+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;
}
posted @ 2024-05-16 21:08  DaWeiGuo  阅读(4)  评论(0编辑  收藏  举报