02_Bellman-Ford.cpp
时间:2019-01-18
本文章向大家介绍02_Bellman-Ford.cpp,主要包括02_Bellman-Ford.cpp使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//SPFA锛堥槦鍒椾紭鍖朆ellmanFord锛?鏈€鍧忔椂闂村鏉傚害n*m锛屼竴鑸儏鍐垫瘮杩欎釜濂界殑澶?
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 BellmanFord
{
int n, m; // 鐐规暟鍜岃竟鏁?
vector<Edge> edges; // 杈瑰垪琛?
vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
bool inq[MAXN]; // 鏄惁鍦ㄩ槦鍒椾腑
int d[MAXN]; // s鍒板悇涓偣鐨勮窛绂?
int p[MAXN]; // p[i]琛ㄧず鏈€鐭矾寰勬爲涓埌杈緄鐐圭殑杈圭殑缂栧彿
int cnt[MAXN]; // 杩涢槦娆℃暟
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)
{
edges.emplace_back(from, to, dist);
m = edges.size();
G[from].push_back(m - 1);
}
bool bellmanford(int s)
{
queue<int> Q;
memset(inq, 0, sizeof(inq));
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i <= n; i++) d[i] = INF;
d[s] = 0;
inq[s] = true;
Q.push(s);
while (!Q.empty())
{
int u = Q.front(); Q.pop();
inq[u] = false;
for (auto& id : G[u])
{
Edge& e = edges[id];
if (d[u] < INF && d[e.to] > d[u] + e.dist)
{
d[e.to] = d[u] + e.dist;
p[e.to] = id;
if (!inq[e.to])
{
Q.push(e.to);
inq[e.to] = true;
if (++cnt[e.to] > n) return false;//鏈夎礋鐜?
}
}
}
}
return true;//鏃犺礋鐜?
}
};
//鏃堕棿澶嶆潅搴*m
const int MAXN = "Edit";
const int INF = 0x3f3f3f3f;
struct Edge
{
int from, to, dist; //璧风偣,缁堢偣,璺濈
Edge(int u, int v, int w):from(u), to(v), dist(w) {}
};
struct BellmanFord
{
int n, m; // 鐐规暟鍜岃竟鏁?
vector<Edge> edges; // 杈瑰垪琛?
vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
bool inq[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)
{
edges.emplace_back(from, to, dist);
m = edges.size();
G[from].push_back(m - 1);
}
bool bellmanford(int s)//bellmanford
{
for (int i = 0; i <= n; i++) d[i] = INF;
d[s] = 0;
for (int k = 0; k < n - 1; k++)//杩唬n-1娆?
{
bool flag = false;
for (int i = 0; i < m; i++)//妫€鏌ユ瘡鏉¤竟
{
Edge& e = edges[i];
if (d[e.from] < INF && d[e.to] > d[e.from] + e.dist)
{
flag = true;
d[e.to] = d[e.from] + e.dist;
p[e.to] = i;
}
}
if (!flag) break;//鍙鏌愪竴娆℃病relax锛岃鏄庢渶鐭矾寰勫凡缁忔煡鎵惧畬姣曪紝鎴栬€呴儴鍒嗙偣涓嶅彲杈撅紝鍙互璺冲嚭
}
for (int i = 0; i < m; i++)
{
Edge& e = edges[i];
if (d[e.from] < INF && d[e.to] > d[e.from] + e.dist) return false;//鏈夎礋鐜?
}
return true;//娌℃湁璐熺幆
}
}gao;
//dfs鐗堟湰鐨凷PFA,濂藉儚鍙互鏇村揩涓€浜涳紵
const int MAXN = "Edit";
const int INF = 0x3f3f3f3f;
struct Edge
{
int from, to, dist; //璧风偣,缁堢偣,璺濈
Edge(int u, int v, int w):from(u), to(v), dist(w) {}
};
struct BellmanFord
{
int n, m; // 鐐规暟鍜岃竟鏁?
vector<Edge> edges; // 杈瑰垪琛?
vector<int> G[MAXN]; // 姣忎釜鑺傜偣鍑哄彂鐨勮竟缂栧彿锛堜粠0寮€濮嬬紪鍙凤級
bool vis[MAXN]; // 鏄惁鍦ㄩ槦鍒椾腑
int d[MAXN]; // s鍒板悇涓偣鐨勮窛绂?
int p[MAXN]; // p[i]琛ㄧず鏈€鐭矾寰勬爲涓埌杈緄鐐圭殑杈圭殑缂栧彿
bool flag;
void init(int n)
{
flag = false;
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)
{
edges.emplace_back(from, to, dist);
m = edges.size();
G[from].push_back(m - 1);
}
void dfs(int u)//spfa
{
vis[u] = true;
for (int i = 0; i < G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if (d[e.to] > d[u] + e.dist)
{
if (vis[e.to]) { flag = true; break ; }
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
dfs(e.to);
}
}
vis[u] = false;
}
bool bellmanford(int s)
{
memset(d, INF, sizeof(d));
memset(vis, 0, sizeof(vis));
d[s] = 0;
dfs(s);
if (flag) return false;//鏈夎礋鐜?
return true;//鏃犺礋鐜?
}
}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 数组属性和方法
- 近期问题: jq循环中异步请求问题
- 启用HSTS并加入HSTS Preload List-附删除HSTS方法
- 聊聊UI标准化
- puppeteer学习----登录人才网并截图
- MySQL 案例:用户鉴权与 Host 优先级
- Http Post 快速使用
- 有赞Flutter插件开发与发布
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyGBS如何实现调阅EasyNVR的视频通道?
- gitlab CI/CD 相关问题
- 微信jssdk分享接口
- 有赞 Flutter 混编方案
- 最近开发问题
- echarts相关问题总结
- 视频上云EasyNTS组网硬件设备登录后自动下线并清除设备信息是什么原因?
- 震惊! 再也不怕蹭网被发现了!