1. 程式人生 > >圖論知識小結4-Dijkstra的陣列模擬實現

圖論知識小結4-Dijkstra的陣列模擬實現

#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等縮寫