面试代码题: Leetcode.1514. 概率最大的路径,一个变种的迪杰斯特拉算法题
没找到基于c++ vector容器实现的迪杰斯特拉算法,自己写了个。
// 求start节点到所有节点的最短路径 编号:0~n-1
vector<int> Dijkstra(vector<vector<int>>& Graph, int start)
{
vector<int> vis(Graph.size());
vector<int> dis(Graph.size(),INT_MAX);
dis[start] = 0;
for (int i = 0; i < Graph.size(); i++)
{
int minn = INT_MAX, temp = -1;
for (int j = 0; j < Graph.size(); j++)
{
if (!vis[j] && dis[j] < minn)
{
minn = dis[j];
temp = j;
}
}
if (temp == -1) return vector<int>();
vis[temp] = 1;
for (int k = 0; k < Graph.size(); k++)
{
if (!vis[k] && Graph[temp][k] != 0)
dis[k] = min(dis[k], Graph[temp][k] + dis[temp]);
}
}
return dis;
}
测试代码:
int main()
{
// n:节点数量 start:起点(0~n-1)
int n, start;
cin >> n >> start;
vector<vector<int>> Graph(n, vector<int>(n, 0));
// 输入图
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> Graph[i][j];
// 计算
vector<int> ret = Dijkstra(Graph, start);
// 输出
for (int i = 0; i < ret.size(); i++)
cout << i << " " << ret[i] << endl;
return 0;
}