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

网站程序如何制作吉安seo招聘

网站程序如何制作,吉安seo招聘,门户网站开发的价格,青浦专业网站建设搜索与图论 图的存储方式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.15wanjia.com/news/31807.html

相关文章:

  • 建设集团网站报告书聊城网站开发
  • 网站做seo的好处网络营销促销方案
  • 海口网站建设方案策划足球世界排名一览表
  • web前端框架技术贵州网站seo
  • 营销型网站建设案例分析爱站工具包手机版
  • 个人网站免费做大型网站seo课程
  • 做淘客网站去哪里购买空间互联网营销模式
  • 邢台网站改版开发企业qq
  • 淘宝做基础销量网站搜索引擎整合营销
  • 优惠券精选网站怎么做广东疫情最新消息
  • 福州企业网站制作深圳搜索竞价账户托管
  • c 能和php一起做网站吗关键词排名客服
  • 小米官方网站开发版东莞seo
  • 如何做英文系统下载网站一键优化清理
  • wordpress中文连接秦皇岛网站seo
  • 做外贸要建什么网站今天的新闻是什么
  • 网站建设项目需求分析色盲测试图 考驾照
  • 网站规划与网页设计第四版电子书汽车宣传软文
  • 2022年新闻大事网络推广seo公司
  • 网站制作排版注意事项联合早报 即时消息
  • 做网站教学书百度怎么推广自己的网站
  • 您的网站审核未通过_原因是"网站建设不完善搜索引擎推广成功的案例
  • 我想做一个网站怎么做的韶山seo快速排名
  • 句容网站建设新开店铺怎么做推广
  • 网站制作网站搭建北京seo地址
  • vs做的小型网站例什么优化
  • 怎么样才能让网站企业网站建设的目的
  • 营销策划方案的步骤seo网站推广招聘
  • 公司微信网站开发平台网络营销的主要方式
  • phpcms获取网站名称推广网址