迪杰斯特拉模板
时间:2019-01-18
本文章向大家介绍迪杰斯特拉模板,主要包括迪杰斯特拉模板使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//鍫嗕紭鍖栵紝鏃堕棿澶嶆潅搴*logn
const int MAXN = "Edit";
const int INF = 0x3f3f3f3f;
struct Edge
{
int from, to, dist;
Edge() {}
Edge(int u, int v, int w) : from(u), to(v), dist(w) {}
};
struct Dijkstra
{
int n, m; // 鐐规暟鍜岃竟鏁?
vector<Edge> edges; // 杈瑰垪琛?
vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
bool done[MAXN]; // 鏄惁宸叉案涔呮爣鍙?
int d[MAXN]; // s鍒板悇鐐圭殑璺濈
int p[MAXN]; // p[i]琛ㄧず鏈€鐭矾寰勬爲涓埌杈緄鐐圭殑杈圭殑缂栧彿
void init(int n)
{
this->n = n, m = 0;
edges.clear(); // 娓呯┖杈硅〃
for (int i = 0; i <= n; i++) G[i].clear(); // 娓呯┖閭绘帴琛?
}
void AddEdge(int from, int to, int dist)
{ // 濡傛灉鏄棤鍚戝浘锛屾瘡鏉℃棤鍚戣竟闇€璋冪敤涓ゆAddEdge
edges.emplace_back(from, to, dist);
m = edges.size();
G[from].push_back(m - 1);
}
struct HeapNode
{
int from, dist;
HeapNode (int u, int d) : from(u), dist(d) {}
bool operator < (const HeapNode& rhs) const
{
return dist > rhs.dist;
}
};
void dijkstra(int s)
{
priority_queue<HeapNode> Q;
for (int i = 0; i <= n; i++) d[i] = INF;
d[s] = 0;
memset(done, 0, sizeof(done));
Q.push(HeapNode(s, 0));
while (!Q.empty())
{
HeapNode x = Q.top(); Q.pop();
int u = x.from;
if (done[u]) continue;
done[u] = true;
for (auto& id : G[u])
{
Edge& e = edges[id];
if (d[e.to] > d[u] + e.dist)
{
d[e.to] = d[u] + e.dist;
p[e.to] = id;
Q.push(HeapNode(e.to, d[e.to]));
}
}
}
}
}gao;
//dijkstra,鏃堕棿澶嶆潅搴^2
const int MAXN = "Edit";
const int INF = 0x3f3f3f3f;
struct Edge
{
int from, to, dist;
Edge() {}
Edge(int u, int v, int w) : from(u), to(v), dist(w) {}
};
struct Dijkstra
{
int n, m; // 鐐规暟鍜岃竟鏁?
vector<Edge> edges; // 杈瑰垪琛?
vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
bool done[MAXN]; // 鏄惁宸叉案涔呮爣鍙?
int d[MAXN]; // s鍒板悇鐐圭殑璺濈
int p[MAXN]; // p[i]琛ㄧず鏈€鐭矾寰勬爲涓埌杈緄鐐圭殑杈圭殑缂栧彿
void init(int n)
{
this->n = n, m = 0;
edges.clear(); // 娓呯┖杈硅〃
for (int i = 0; i <= n; i++) G[i].clear(); // 娓呯┖閭绘帴琛?
}
void AddEdge(int from, int to, int dist)
{ // 濡傛灉鏄棤鍚戝浘锛屾瘡鏉℃棤鍚戣竟闇€璋冪敤涓ゆAddEdge
edges.emplace_back(from, to, dist);
m = edges.size();
G[from].push_back(m - 1);
}
void dijkstra(int s)
{ // 娉ㄦ剰姝ょ鍐欐硶缂栧彿浠?寮€濮?
for (int i = 0; i <= n; i++) d[i] = INF;
d[s] = 0;
memset(done, 0, sizeof(done));
for (int i = 0; i < n; i++)
{
int pos, MIN = INF;
for (int j = 0; j < n; j++)
{
if(!done[j] && d[j] < MIN) MIN = d[pos = j];
}
done[pos] = true;
for (auto id : G[pos])
{
Edge& e = edges[id];
if (d[e.to] > d[pos] + e.dist)
{
d[e.to] = d[pos] + e.dist;
p[e.to] = id;
}
}
}
}
}gao;
解释转码码有问题望见谅参考刘汝佳蓝书
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
- R语言中的偏最小二乘回归PLS-DA
- R语言实现偏最小二乘回归法 partial least squares (PLS)回归
- 用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类
- python爬虫进行Web抓取LDA主题语义数据分析报告
- Python使用神经网络进行简单文本分类
- 在Python中自然语言处理生成词云WordCloud
- 使用Python中的ImageAI进行对象检测
- 适用于NLP自然语言处理的Python:使用Facebook FastText库
- R语言ISLR工资数据进行多项式回归和样条回归分析
- Python中用PyTorch机器学习分类预测银行客户流失模型
- R语言犯罪率回归模型报告Regression model on crimerate report
- leetcode树之从根到叶的二进制数之和
- 超冗余机器人运动控制:蛇形机器人 & 8自由度平面机械臂
- Linux Ubuntu / CentOS / MacOS 等系统安装使用 MTR 以及阅读分析 MTR 报告教程