圖論知識小結4-Dijkstra的陣列模擬實現
阿新 • • 發佈:2018-12-11
#include <bits/stdc++.h> using namespace std; const int MAX_EDGE = 10000; const int MAX_VERTICES = 100; struct Edge{ int len, v, last; } edgem[MAX_EDGE]; int latest_edge_of_u[MAX_VERTICES]; int eid, nv, ne; // nv represent for num of vertices, while ne represent for num of edges int distance[MAX_VERTICES]; bool vst[MAX_VERTICES]; void init(){ for(int i = 0 ; i < MAX_VERTICES ; i++){ vst[i] = false; distance[i] = 2000000000; //Initialize the distance as infinite } eid = 0; for(int i = 0 ; i < nv ; i++){ vst[i] = false; } memset(latest_edge_of_u, 0, sizeof(latest_edge_of_u)); } void insert(int w, int u, int v){ if(w){ edge[eid].v = v; edge[eid].last = latest_edge_of_u[u]; latest_edge_of_u[u] = eid++; } } int find_min(){ int min_weight = 0, min_index = 0; for(int i = 0 ; i < nv ; i++){ if(!vst[i]){ min_weight = distance[i]; min_index = i; } } for(int i = 0 ; i < nv ; i++){ if(distance[i] < min_weight){ min_weight = distance[i]; min_index = i; } } vst[min_index] = true; return min_index; } void dijkstra(int start){ distance[start] = 0; for(int times = 0 ; times < nv ; times++){ int u = find_min(); for(eid = latest_edge_of_u[u] ; eid != -1 ; eid = edge[eid].last){ if(distance[edge[eid].v] > distance[u] + edge[eid].len){ distance[edge[eid].v] = distance[u] + edge[eid].len; } } } } int main(){ cin >> nv >> ne; init(); //特別注意這裡的順序,init一定要放到cin之後 return 0; }
還有,distance好像有時候會衝突,答題時最好使用dis等縮寫