之前qaq一直沒有準備堆優化模板,本例以pat a1003為例,整理dijkstra和dijkstra堆優化模板
我們可以發現該篇幅找最小值部分是使用量乙個for迴圈
#include #include using namespace std;
int n, m, c1, c2;
int edge[510][510], weight[510], dis[510], num[510], w[510];
bool vis[510];
const int inf = 99999999;
int main()
dis[c1] = 0;
w[c1] = weight[c1];
num[c1] = 1;
while(true)
}if(u == -1) break;
vis[u] = true;
for(int v = 0; v < n; v++) else if(dis[u] + edge[u][v] == dis[v]) }}
}printf("%d %d", num[c2], w[c2]);
return 0;
}
我們在找最小值那部分進行替換成堆即可
#include #include #include using namespace std;
int n, m, c1, c2;
int edge[510][510], weight[510], dis[510], num[510], w[510];
bool vis[510];
const int inf = 99999999;
priority_queue, vector>, greater>> q;
int main()
dis[c1] = 0;
w[c1] = weight[c1];
num[c1] = 1;
q.push();
while(q.size()) else if(dis[u] + edge[u][v] == dis[v])
q.push();}}
}printf("%d %d", num[c2], w[c2]);
return 0;
}
Bellman Ford演算法和Dijkstra演算法
bellman ford演算法是通過relax邊來實現的,由於最短無負權迴路的路徑應該最多有v 1條邊,所以一共執行v 1次relax操作即可,而且注意,每次relax操作都只是基於上一次relax操作之後的圖,和這次relax中已經relax了的節點毫無關係 這個是重點!檢查負權迴路原理 若有負權...
基於STL優先佇列和鄰接表的dijkstra演算法
首先說下stl優先佇列的侷限性,那就是只提供入隊 出隊 取得隊首元素的值的功能,而dijkstra演算法的堆優化需要能夠隨機訪問佇列中某個節點 來更新源點節點的最短距離 看似可以用vector配合make heap push heap pop heap來實現這個功能,實際上手動實現就會發現問題所在。...
Dijkstra和Floyd演算法
floyd 演算法 如果要求所有兩結點間的最短路徑,則可以使用 dijkstra演算法n 次完成,時間複雜度是 o n 3 floyd 還提出過另乙個演算法,同樣是 o n 3 的複雜度,但形式上更簡單些。要求的解是乙個矩陣 n n 其中s i j 表示結點i到 j的最短路徑,演算法很像動態 規劃演...