单源最短路径

Bellman-Ford算法

//无负环
//时间复杂度:O(nm)
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        vector<int> dist(n+1, 1e9);
        dist[k]=0;
        vector<int> from(n+1, -1); 
        for(int round=1; round<n; ++round){
            bool flag=false;
            for(auto & time:times){
                int x=time[0];
                int y=time[1];
                int z=time[2];
                if(dist[x]+z<dist[y]){
                    dist[y] = dist[x]+z;
                    from[y] = x;
                    flag=true;
                }
            }
            if(!flag) break;
        }
        int res=0;
        int intFrom;
        for(int i=1;i<=n; ++i){
            if(dist[i]>res){
                res = dist[i];
                intFrom = i;
            }
        }
        //逆序打印路径
        cout<<intFrom<<endl;
        while(from[intFrom]!=-1){
            //cout<<intFrom<<endl;
            intFrom=from[intFrom];
            cout<<intFrom<<endl;
        }
        return res==1e9? -1:res;
    }
};

Dijkstra算法

//Bellman算法基于随机更新,有很多不不要的更新
//Dijkstra算法基于贪心的思想,先算小的,再算大的
//所有边的长度都是非负数的图
//世间复杂度:O(m*log(n))
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        //建图
        vector<vector<int>> vertexs(n+1);
        vector<vector<int>> edges(n+1);
        for(auto& time:times){
            int x = time[0];
            int y = time[1];
            int z = time[2];
            vertexs[x].push_back(y);
            edges[x].push_back(z);
        }

        priority_queue<pair<int, int>> q;//默认是大根堆
        vector<bool> visited(n+1, false);
        vector<int> dist(n+1, 1e9);
        vector<int> path(n+1, -1);
        dist[k]=0;
        q.push(make_pair(-dist[k], k));
        while(!q.empty()){
            int x = q.top().second;
            q.pop();
            if(visited[x]) continue;
            visited[x]=true;
            for(int i=0;i<vertexs[x].size(); ++i){
                int y=vertexs[x][i];
                int z=edges[x][i];
                if(dist[x]+z<dist[y]){
                    dist[y] = dist[x]+z;
                    path[y] = x;
                    q.push(make_pair(-dist[y], y));
                }
            }
        }
        int res=0;
        //打印从末节点到源节点的路径
        int end = 1;
        cout<<"末节点:"<<end<<endl;
        while(path[end]!=-1){
            end=path[end];
            cout<<end<<endl;
        }
        for(int i=1; i<dist.size(); ++i) res = max(res, dist[i]);
        return res==1e9? -1:res;
        
    }
};

743网络延长时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值