Đề bài: https://leetcode.com/problems/network-delay-time/
Ý tưởng và triển khai như source code và comment bên dưới:
class Solution
{
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k)
{
// chuyển đổi vector times thành dạng đồ thị cạnh kề
// với mỗi đỉnh u, có 1 vector cạnh kề (v, weight_to_v)
std::unordered_map<int, std::vector<std::pair<int, int>>> graph;
for (const std::vector<int>& time : times)
{
graph[time[0] - 1].push_back( { time[1] - 1, time[2] } );
}
// build một mảng khoảng cách ngắn nhất để đi từ đỉnh k đến các đỉnh còn lại
std::vector<int> res = ShortestDistanceAllVertices(graph, n, k - 1);
// tìm khoảng cách dài nhất để signal phát ra từ k phải truyền đi
// để đến được điểm xa nhất trên đồ thị
int max_time = 0;
for (const int& n : res)
{
cout << n << " ";
max_time = std::max(max_time, n);
}
// max_time == INT_MAX nghĩa là vẫn còn đỉnh không thể truyền tín hiệu đến
return max_time == INT_MAX ? -1 : max_time;
}
private:
// cài đặt thuật toán Dijsktra
// trả về một mảng đường đi ngắn nhất từ đỉnh k đến các đỉnh còn lại
std::vector<int> ShortestDistanceAllVertices(std::unordered_map<int, std::vector<std::pair<int, int>>>& G, int num_vertices, int from)
{
if (from < 0 || from >= num_vertices)
return {};
std::vector<int> dist(num_vertices, INT_MAX);
dist[from] = 0;
std::vector<bool> visited(num_vertices, false);
for (int count = 0; count < num_vertices; count++)
{
int u = DijsktraNextVertex(num_vertices, dist, visited);
visited[u] = true;
for (std::pair<int, int> p : G[u])
{
int v = p.first;
int w = p.second;
if (!visited[v] && w && dist[u] != INT_MAX && dist[u] + w < dist[v])
{
dist[v] = dist[u] + w;
cout << v << " " << dist[v] << endl;
}
}
}
return dist;
}
int DijsktraNextVertex(int num_vertices, const std::vector<int> &dist, const std::vector<bool> &visited)
{
int minDist = INT_MAX;
int minIdx = -1;
for (int u = 0; u < num_vertices; u++)
{
if (!visited[u] && dist[u] <= minDist)
{
minDist = dist[u];
minIdx = u;
}
}
return minIdx;
}
};
Kết quả output sai ở testcase như bên dưới:
Your input
[[3,5,78],[2,1,1],[1,3,0],[4,3,59],[5,3,85],[5,2,22],[2,4,23],[1,4,43],[4,5,75],[5,1,15],[1,5,91],[4,1,16],[3,2,98],[3,4,22],[5,4,31],[1,2,0],[2,5,4],[4,2,51],[3,1,36],[2,3,59]]
5
5
Output
81
Expected
31
stdout
15 22 81 31 0
Kết quả mong đợi là 31 (tín hiệu truyền từ 5 đến đỉnh 4 là xa nhất) , nhưng stdout cho thấy đi từ đỉnh 5 đến đỉnh 3 lại tốn đến 81 đơn vị khoảng cách.
Mình có sai về ý tưởng không? Có chổ nào sai trong phần cài đăt thuật toán nhỉ?