单源点最短路(dijkstra)

该博客介绍了如何使用Dijkstra算法寻找有向无环图(DAG)中从节点1到节点n的最短路径。在可能存在重边的情况下,算法会选择边的最小权重,并处理自环的影响。如果无法从1到达n,则返回-1。代码示例展示了如何实现这一算法,包括邻接矩阵的初始化和最短路径的计算过程。

题目描述
在一个有向无环图中,已知每条边长,求出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];
       
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值