使用Dijkstra的最大概率路径
Max-Probability Paths Using Dijkstra
我用dijkstra算法编写了这个程序来求双向图中的最短路径。能否将此算法转化为求图中最长路径的程序?
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define ft first
#define sd second
vector< pair<long long int,long long int> > g[101000];
long long int n,m;
vector<long long int> dist;
vector <long long int> vis;
void dijkstra(long long int source,long long int l)
{
dist.clear();
long long int i,j,k;
for(i=0;i<n;i++)
{
dist.push_back(INT_MAX);
vis.push_back(0);
}
dist[source] = 0;
set< pair<long long int,long long int> > s; // pair is dist, node_number
set< pair<long long int,long long int> >::iterator it;
for(i=0;i<n;i++)
s.insert(mp(dist[i],i));
while(!s.empty())
{
it = s.begin();
pair<long long int,long long int> temp = *it;
s.erase(temp); // remove minimum val node
long long int cur = temp.sd;
long long int val = temp.ft;
if(val == INT_MAX)
return;
for(i=0;i<g[cur].size();i++)
{
long long int nb = g[cur][i].ft;
if(!vis[nb] && dist[nb] > val + g[cur][i].sd)
{
s.erase(mp(dist[nb],nb)); // erase old val
dist[nb] = val + g[cur][i].sd;
s.insert(mp(dist[nb],nb));
}
}
}
for(int i=0;i<n;i++)
{
cout<<dist[i]<<" ";
}
cout<<endl;
}
int main()
{
long long int i,j,k;
dist.clear();
vis.clear();
long long int x,y,z;
cin>>n>>m;
for(i=0;i<m;i++)
g[i].clear();
for(i=0;i<m;i++)
{
cin>>x>>y>>z;
x--; y--;
g[x].push_back(mp(y,z));
g[y].push_back(mp(x,z));
}
dijkstra(0,n-1);
return 0;
}
基本上我有概率而不是路径成本,所以我想要的是具有最大概率的路径。我该怎么做呢?
(离题-使用#include <bits/stdc++.h>
是一个不可移植的hack)
基本上我有概率而不是路径成本,所以我想要的是具有最大概率的路径。我怎样才能做到这一点呢?
假设从s开始,你想找到每个v的最大概率路径。如果在这些路径中,概率为Πipi的路径最大,则-∑ilog(pi)最小。请注意,这对应于每个边权值为log(1/pi)的图,这是正的,因此您可以应用Dijkstra(将没有负权循环)。
相关文章:
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- C++A*算法并不总是在路径中具有目标节点
- 如何根据单词在文本中出现的概率输出单词
- 从函数角度看ID到文件路径的内部与外部映射
- boost xml parsingl将xml的路径作为变量发送
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 如何使用cppcheck处理半相对包含路径
- 在C++中设置基于操作系统的文件路径
- 基于编译器选项的编译二进制路径
- 按边长度递归搜索图中所有可行路径
- 使用变量值作为 PlaySound 中的路径
- 如何转换真实路径 CString c++
- 从 GUID 获取 USB 卷路径
- 查找 GCD:并非所有控制路径都返回值
- C++17 文件系统::remove_all 带有通配符路径
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- 获取当前正在运行的 exe 名称(不是路径)
- 如何从 Skia 路径几何体中获取网格?
- 使用Dijkstra的最大概率路径