当前位置: 首页 > news >正文

网站程序如何制作贵阳网站优化公司

网站程序如何制作,贵阳网站优化公司,WordPress防js注入,效果图在线接单平台搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法(朴素版)2.2、Dijkstra算法(堆优化版)2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

搜索与图论

  • 图的存储方式
  • 2、最短路问题
    • 2.1、Dijkstra算法(朴素版)
    • 2.2、Dijkstra算法(堆优化版)
    • 2.3、Bellman-Ford算法
    • 2.4、SPFA求最短路
    • 2.5、SPFA判负环
    • 2.6、Floyd算法

图的存储方式

在这里插入图片描述

2、最短路问题

最短路问题可以分为单源最短路问题和多源最短路问题,单源最短路问题就是求出从点1->n的最短距离,而多源最短路问题就是求出从点i->j的最短距离。单源最短路问题还可以分为正权边的单源最短路问题和负权边的单源最短路问题。具体算法和时间复杂度如下图:

在这里插入图片描述

2.1、Dijkstra算法(朴素版)

在这里插入图片描述
算法模板:

#include <iostream>
#include <cstring>using namespace std;
const int N = 510;
int g[N][N], d[N];
int n, m;
bool st[N];int dijkstra()
{memset(d, 0x3f, sizeof d);d[1] = 0;for (int i = 0; i < n; i++){int t = -1;for (int j = 1; j <= n; j++)if (!st[j] && (t == -1 || d[t] > d[j]))t = j;st[t] = true;for (int j = 1; j <= n; j++)d[j] = min(d[j], d[t] + g[t][j]);}return d[n] == 0x3f3f3f3f ? -1 : d[n];
}int main()
{cin >> n >> m;memset(g, 0x3f, sizeof g);while (m--){int a, b, c;scanf("%d%d%d", &a, &b, &c);g[a][b] = min(g[a][b], c);}cout << dijkstra() << endl;return 0;
}

2.2、Dijkstra算法(堆优化版)

下面来看看如何优化:
在这里插入图片描述

算法模板:

#include <iostream>
#include <cstring>
#include <queue>using namespace std;
typedef pair<int, int> PII;
const int N = 1.5e5+10;
int h[N], e[N], w[N], ne[N], idx;
int n, m, d[N];
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}int dijkstra()
{memset(d, 0x3f, sizeof d);d[1] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, 1});while (heap.size()){auto t = heap.top();heap.pop();int ver = t.second, dis = t.first;if (st[ver]) continue;st[ver] = true;for (int i = h[ver]; i != -1; i = ne[i]){int j = e[i];if (d[j] > dis + w[i]){d[j] = dis + w[i];heap.push({d[j], j});}}}return d[n] == 0x3f3f3f3f ? -1 : d[n];
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);while (m--){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c);}cout << dijkstra() << endl;return 0;
}

2.3、Bellman-Ford算法

在这里插入图片描述
代码模板:

#include <iostream>
#include <cstring>using namespace std;
const int N = 510, M = 10010;
int n, m, k;
int d[N], backup[N];struct Edge
{int a, b, w;
}edges[M];void bellman_ford()
{memset(d, 0x3f, sizeof d);d[1] = 0;for (int i = 0; i < k; i++){memcpy(backup, d, sizeof d);for (int j = 0; j < m; j++){auto e = edges[j];d[e.b] = min(d[e.b], backup[e.a] + e.w);}}
}int main()
{cin >> n >> m >> k;for (int i = 0; i < m; i++){int a, b, w;scanf("%d%d%d", &a, &b, &w);edges[i] = {a, b, w};}bellman_ford();if (d[n] > 0x3f3f3f3f / 2) cout << "impossible" << endl;else cout << d[n] << endl;return 0;
}

2.4、SPFA求最短路

在这里插入图片描述

代码模板:

#include <iostream>
#include <cstring>
#include <queue>using namespace std;
const int N = 1e5+10;
int n, m;
int h[N], e[N], w[N], ne[N], idx;
int d[N];
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}void spfa()
{memset(d, 0x3f, sizeof d);d[1] = 0;queue<int> q;q.push(1);st[1] = true;while (q.size()){auto t = q.front();q.pop();st[t] = false;for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (d[j] > d[t] + w[i]){d[j] = d[t] + w[i];if (!st[j]){st[j] = true;q.push(j);}}}}
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);while (m--){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c);}spfa();if (d[n] == 0x3f3f3f3f) cout << "impossible" << endl;else cout << d[n] << endl;return 0;
}

2.5、SPFA判负环

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <queue>using namespace std;
const int N = 2010, M = 10010;
int h[N], e[M], w[M], ne[M], idx;
int n, m;
int d[N], cnt[N];
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}bool spfa()
{queue<int> q;for (int i = 1; i <= n; i++){q.push(i);st[i] = true;}while (q.size()){auto t = q.front();q.pop();st[t] = false;for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (d[j] > d[t] + w[i]){d[j] = d[t] + w[i];cnt[j] = cnt[t] + 1;if (cnt[j] >= n) return true;if (!st[j]){st[j] = true;q.push(j);}}}}return false;
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);while (m--){int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c);}if (spfa()) cout << "Yes" << endl;else cout << "No" << endl;return 0;
}

2.6、Floyd算法

在这里插入图片描述

#include <iostream>
#include <cstring>using namespace std;
const int N = 210, INF = 0x3f3f3f3f;
int d[N][N];
int n, m, k;void floyd()
{for (int k = 1; k <= n; k++)for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}int main()
{cin >> n >> m >> k;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (i == j) d[i][j] = 0;else d[i][j] = INF;while (m--){int a, b, c;cin >> a >> b >> c;d[a][b] = min(d[a][b], c);}floyd();while (k--){int l, r;cin >> l >> r;if (d[l][r] > INF / 2) cout << "impossible" << endl;else cout << d[l][r] << endl;}return 0;
}
http://www.dinnco.com/news/67804.html

相关文章:

  • 免费好用的网站制作百度seo优化服务
  • fla可以做网站么新网店怎么免费推广
  • 做么自己做一个网站优化设计电子课本下载
  • 北京有做网站的吗长沙网站seo诊断
  • 哈尔滨做网站哪家好强一键优化清理手机
  • 微信上浏览自己做的网站手机百度高级搜索入口
  • 黄岛网站建设价格网站软文推广网站
  • 泉州企业免费建站双桥seo排名优化培训
  • 在线做GO分析的网站百度云资源搜索网站
  • 股权分配方案创业初期北京百度推广优化
  • 扬州网站建设价格低手机百度云网页版登录
  • 用lnmp做网站河北网站seo策划
  • 摄影师 网站 模板seo推广专员招聘
  • 网站续费骗局游戏推广
  • app开发和网站建设区别seo问答
  • 以遇见为主题做网站软件开发自学步骤
  • 产品设计优秀网站东莞seo网站制作报价
  • 六安论坛招聘网最新招聘网站seo服务公司
  • 昌乐做网站信息流优化师招聘
  • 什么网站可以做图赚钱吗网络营销外包
  • 网站如何接入支付宝重庆seo网站哪家好
  • 福州住房建设厅网站成都seo正规优化
  • 网站还没有做解析是什么意思网站seo方案
  • 龙岗地区做网站公司北京seo网站优化培训
  • 汽车金融网站怎么做怎么让关键词快速上首页
  • 怎么做自己的简历网站百度推广后台登录
  • 有了网站源码可以做网站吗如何对一个网站进行seo
  • 洛阳霞光做网站的公司深圳app推广平台
  • b2c平台网站建设排名优化哪家好
  • php网站开发最新需求品牌策划案