class Solution {
public:
struct cmp
{
bool operator() (const pair<int,double>& a,const pair<int,double>& b)
{
return a.second<b.second;
}
};
vector<double> d;
vector<int> visit;
vector<vector<pair<int,double>>> adj;
priority_queue<pair<int,double>,vector<pair<int,double>>,cmp> pq;
void dijkstra(int t,int n)
{
d[t]=1;
pq.push({t,1});
while(!pq.empty())
{
auto tmp=pq.top(); pq.pop();
int u=tmp.first;
if(visit[u]) continue;
double p=tmp.second;
visit[u]=1;
for(auto x:adj[u])
{
if(!visit[x.first])
{
if(d[x.first]<d[u]*x.second)
{
d[x.first]=d[u]*x.second;
pq.push({x.first,d[x.first]});
}
}
}
}
}
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
d.resize(n);
adj.resize(n);
visit.resize(n);
int edgenum=edges.size();
for(int i=0;i<edgenum;i++)
{
int a=edges[i][0],b=edges[i][1];
double p=succProb[i];
adj[a].push_back({b,p});
adj[b].push_back({a,p});
}
dijkstra(start,n);
return d[end];
}
};
Leetcode 1514. 概率最大的路径 Dijkstra+修改+优化
最新推荐文章于 2023-09-07 16:15:29 发布