题目描述
在一个有向无环图中,已知每条边长,求出1到n的最短路径,返回1到n的最短路径值。如果1无法到n,输出-1
示例1
输入 5,5,[[1,2,2],[1,4,5],[2,3,3],[3,5,4],[4,5,5]]
返回值 9
备注:
两个整数n和m,表示图的顶点数和边数。一个二维数组,一维3个数据,表示顶点到另外一个顶点的边长度是多少。每条边的长度范围[0,1000]。注意数据中可能有重边
题解:
自环在朴素版dijkstra算法中是没有任何影响的,所以自环的权值是多少都可以,只要不是负数就行。
重边要选择边最小的一条。
const int N=510;
class Solution {
public:
int findShortestPath(int n, int m, vector<vector<int> >& graph) {
int dist[N];//记录起始点 1 到 n 的最短距离
int g[N][N];//邻接表存储图结构
bool st[N];//节点是否被遍历过
// write code here
memset(g,0x3f,sizeof g);
for(int i=0;i<m;i++)
{
int a=graph[i][0];
int b=graph[i][1];
int w=graph[i][2];
g[a][b]=min(g[a][b],w);//选择重边中的最小值
}
memset(dist,0x3f,sizeof dist);
dist[1]=0;//初始化 1 到 1 的距离为0
for(int i=0;i<n;i++)
{
int t=-1;//保存遍历过程中的中间节点
for(int j=1;j<=n;j++)
{
if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;
}
st[t]=true;
for(int j=1;j<=n;j++)
{
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
}
// cout<<dist[n]<<endl;
if(dist[n]==0x3f3f3f3f) return -1;
else return dist[n];
}
};
该博客介绍了如何使用Dijkstra算法寻找有向无环图(DAG)中从节点1到节点n的最短路径。在可能存在重边的情况下,算法会选择边的最小权重,并处理自环的影响。如果无法从1到达n,则返回-1。代码示例展示了如何实现这一算法,包括邻接矩阵的初始化和最短路径的计算过程。
&spm=1001.2101.3001.5002&articleId=116499995&d=1&t=3&u=bdbb0f6183ee48baa54c4ff58c8c66e5)
1324

被折叠的 条评论
为什么被折叠?



