鱼C论坛

 找回密码
 立即注册
查看: 2773|回复: 4

最短路径求解算法的实现和时间复杂度分析

[复制链接]
发表于 2019-12-6 13:55:46 | 显示全部楼层 |阅读模式
10鱼币
大佬们,请帮帮忙,可额外支付宝转账,留言qq私聊

WX20191206-135305@2x.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-7 12:08:21 | 显示全部楼层
根本看不懂   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-7 20:05:40 | 显示全部楼层

太难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-11 23:14:46 | 显示全部楼层
本帖最后由 月亮会发光 于 2020-1-11 23:16 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-11 23:19:34 | 显示全部楼层
/*
由于本人没学Floyd就介绍 Dijkstra和SPFA
代码为c++

第一段代码用的是spfa算法,相对来说时间复杂度更高一些
如果图随机生成,时间复杂度为O(KM) (常数k想小一点小就看你自己怎么优化了)
但是实际上SPFA的算法复杂度是O(NM)。
不怎么推荐这个算法,比如2018年NOi比赛就卡了SPFA时间复杂度
(K可以当作常数,m边数,n点数)
*/
#include <iostream>
#include <cstdio>
#include <queue>
#define MAXN 10010
#define MAXM 500010
#define INF 2147483647
using namespace std;

queue<int> q;
struct Edge {
        int next,to,w;
}edge[MAXM];
int n,m,s,cnt,head[MAXN],vis[MAXN],dis[MAXN];

void spfa() {
        for(int i=1;i<=n;i++)
                dis[i] = INF;
        q.push(s);
        dis[s] = 0;
        vis[s] = 1;
        while(!q.empty()) {
                int u = q.front();
                q.pop();
                vis[u] = 0;
                for(int i=head[u];i;i=edge[i].next) {
                        int v = edge[i].to;
                        if(dis[v]>dis[u]+edge[i].w) {
                                dis[v] = dis[u] + edge[i].w;
                                if(!vis[v]) {
                                        vis[v] = 1;
                                        q.push(v);
                                }
                        }
                }
        }
}
void edge_add(int u,int v,int w) {
        cnt++;
        edge[cnt].next = head[u];
        edge[cnt].to = v;
        edge[cnt].w = w;
        head[u] = cnt;
}

int main() {
        cin >> n >> m >> s;
        for (int i=1;i<=m;i++) {
                int u,v,w;
                cin >> u >> v >> w;
                edge_add(u,v,w);
        }
        spfa();
        for(int i=1;i<=n;i++)
                cout << dis[i] << " ";
        return 0;
}





/*下面这段代码是Dijkstra
采用了优先队列priority_queue+重载的堆优化
priority_queue是c++ stl库里的东西,可以学习下

时间按复杂度O( (n+m) log n)
m很大的时候会比较慢
不过总的来说比SPFA优化了许多
*/
#include <iostream>
#include <cstdio>
#include <queue>
#define MAXN 100100
#define MAXM 5000100
#define INF 2147483647
using namespace std;


struct Edge {
        int next,to,w;
}edge[MAXM];
int n,m,s,cnt,head[MAXN],vis[MAXN],dis[MAXN];

struct node {
        int pos,dis;
        bool operator<(const node &a) const{
                return a.dis<dis;
        }
};
priority_queue<node> q;

void dj() {
        for(int i=1;i<=n;i++)
                dis[i] = INF;
        dis[s] = 0;
        node tmp;
        tmp.pos = s;
        tmp.dis = 0;
        q.push(tmp);
        while(!q.empty()) {
                int u = q.top().pos;
                q.pop();
                if(!vis[u]) {
                        vis[u] = 1;
                        for(int i=head[u];i;i=edge[i].next) {
                                int v = edge[i].to;
                                if(dis[v]>dis[u]+edge[i].w) {
                                        dis[v] = dis[u] + edge[i].w;
                                        tmp.pos = v;
                                        tmp.dis = dis[v];
                                        q.push(tmp);
                                }
                        }
                }
        }
}
void edge_add(int u,int v,int w) {
        cnt++;
        edge[cnt].next = head[u];
        edge[cnt].to = v;
        edge[cnt].w = w;
        head[u] = cnt;
}

int main() {
        cin >> n >> m >> s;
        for (int i=1;i<=m;i++) {
                int u,v,w;
                cin >> u >> v >> w;
                edge_add(u,v,w);
        }
        dj();
        for(int i=1;i<=n;i++)
                cout << dis[i] << " ";
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 07:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表