Dijkstra算法,不能處理負邊負環,不連通時返回-1。使用優先隊列可以優化一下,此處不做介紹。
貪心策略。
鄰接矩陣實現。亦可用鄰接表,效率好一些。
const int maxn = 110;
const int max_int = ~(1<<31);
const int min_int = (1<<31);
bool vis[maxn];
int cost[maxn][maxn], dist[maxn];
//[0,max_int]
int min(int a, int b){
return a < b ? a : b;
}
int dijkstra(int s){
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; ++i){
dist[i] = max_int;
}
dist[s] = 0;
vis[s] = true;
for(int k = 1; k < n; ++k){
int maxv = max_int, v = -1;
for(int i = 0; i < n; ++i){
if(!vis[i] && d[i] < maxv){
maxv = d[v = i];
}
}
if(-1 == v)return -1;
vis[v] = true;
for(int i = 0; i < n; ++i){
if(!vis[i]){
d[i] = min(d[i], d[v] + cost[v][i]);
}
}
}
}