使用 Dijkstra 的最大概率路径

Posted

技术标签:

【中文标题】使用 Dijkstra 的最大概率路径【英文标题】:Max-Probability Paths Using Dijkstra 【发布时间】:2016-10-29 06:33:32 【问题描述】:

我使用 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;

基本上我有的是概率而不是路径成本,所以我想要的是具有最大概率的路径。我怎样才能实现这一目标。

【问题讨论】:

@BeyelerStudios IINM,这是有问题的:在不断加法之后的否定会在结果图中找到最便宜 + 最短路径的组合,这不一定是原始图中最昂贵的路径。在任何情况下,问题都是关于路径概率,在任何情况下都不能完全这样总结。 【参考方案1】:

(离题 - 使用#include &lt;bits/stdc++.h&gt; 是一种不可移植的黑客攻击。)

基本上我有的是概率而不是路径成本,所以我想要的是具有最大概率的路径。我怎样才能实现这一目标。

假设从s开始,你想找到到每个v的概率最大的路径。如果概率Πipi的路径在这些路径中最大,则-∑i log(pi) 最小。请注意,这对应于每个边权重为 log(1/pi) 的图,这是正数,因此您可以应用 Dijkstra(不会有负权重循环)。

【讨论】:

以上是关于使用 Dijkstra 的最大概率路径的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)

dijkstra算法计算最短路径和并输出最短路径

poj 1797 最大最小容量dijkstra (经典)

POJ - 2253 Frogger(最短路Dijkstra or flod)

5211. 概率最大的路径(197)

Gym - 100851F - Froggy Ford(dijkstra)