图的最短路径一般有Floyd、DisjKstra、Bellman-Ford、SPFA算法,前两种用的更加普遍.
我们用一道题目来解决前两种算法的使用问题.
![47501775337e8d6d8a13a56ff0b630be.png](https://i-blog.csdnimg.cn/blog_migrate/e5149a0c770619f6aa4a142591b96a02.jpeg)
使用Floyd算法,代码还是比较简单的
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int Ka) {
vector<vector<long>>grap(N + 1,vector<long>(N + 1,INT_MAX));
for(int i = 1;i <= N;i++)grap[i][i] = 0;
for(auto e : times) grap[e[0]][e[1]] = e[2];
//Floyd的核心算法
for(int k = 1;k <= N;k++)
{
for(int i = 1;i <= N;i++)
{
for(int j = 1;j <= N;j++)
{
grap[i][j]=min(grap[i][j],grap[i][k]+grap[k][j]);
}
}
}
int ans = 0;
for(int i = 1;i <= N;i++)
{
if(grap[Ka][i] == INT_MAX) return -1;
ans = max(ans,(int)grap[Ka][i]);
}
return ans;
}
};
DisjKstra算法
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int Ka) {
vector<vector<long>>grap(N + 1,vector<long>(N + 1,INT_MAX));
for(int i = 1;i <= N;i++)grap[i][i] = 0;
for(auto e : times) grap[e[0]][e[1]] = e[2];
//以下是DisjKstra的核心算法
vector<bool> visited(N + 1,false);
visited[Ka] = true;
for(int i = 1;i <= N;i++)
{
int min_id = 0;
int minnum = INT_MAX;
for(int j = 1;j <= N;j++)
{
if(!visited[j] && grap[Ka][j] < minnum)
{
min_id = j;
minnum = grap[Ka][j];
}
}
visited[min_id] = true;
for(int j = 1;j <= N;j++)
{
if(!visited[j] && grap[Ka][j] > grap[Ka][min_id] + grap[min_id][j])
{
grap[Ka][j] = grap[Ka][min_id] + grap[min_id][j];
}
}
}
int ans = 0;
for(int i = 1;i <= N;i++)
{
if(grap[Ka][i] == INT_MAX) return -1;
ans = max(ans,(int)grap[Ka][i]);
}
return ans;
}
};