使用完整的c语言实现:概率最大的路径 Description 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组成,其中 edges[i] = [a, b] 表示连接节点 a 和 b 的一条无向边,且该边遍历成功的概率为 succProb[i] 。 指定两个节点分别作为起点 start 和终点 end ,请你找出从起点到终点成功概率最大的路径,并返回其成功概率。 Input 第一行为两个个整数n,m,n表示点的个数,m表示无向边的个数 接下来m行每行有三个数分别表示边的起点和终点a,b以及一个浮点数succProb[i] 最后一行有两个整数表示start和end两个节点 Output 从起点到终点的最大概率 Sample Input 1 3 3 0 1 0.5 1 2 0.5 0 2 0.2 0 2 Sample Output 1 0.25 Sample Input 2 3 1 0 1 0.5 0 2 Sample Output 2 0 Hint 2 <= n <= 10000 0 <= start, end < n start != end 0 <= a, b < n a != b 0 <= succProb.length == edges.length <= 10000 0 <= succProb[i] <= 1
时间: 2024-03-22 10:42:05 浏览: 152
好的,下面是使用C语言实现LeetCode第1514题的完整代码。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 10010
#define MAX_M 500010
struct Edge {
int to;
double p;
int nxt;
} edge[MAX_M];
int head[MAX_N], cnt = 0;
void addEdge(int u, int v, double p) {
edge[++cnt].to = v;
edge[cnt].p = p;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
double maxProbability(int n, int** edges, int edgesSize, int* edgesColSize, double* succProb, int start, int end){
double p[MAX_N];
int vis[MAX_N];
memset(p, 0, sizeof(p));
memset(vis, 0, sizeof(vis));
p[start] = 1;
for (int i = 0; i < edgesSize; i++) {
int u = edges[i][0], v = edges[i][1];
double w = succProb[i];
addEdge(u, v, w);
addEdge(v, u, w);
}
priority_queue<pair<double, int>> q;
q.push({1, start});
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int e = head[u]; e; e = edge[e].nxt) {
int v = edge[e].to;
double w = edge[e].p;
if (p[u] * w > p[v]) {
p[v] = p[u] * w;
q.push({p[v], v});
}
}
}
return p[end];
}
int main() {
int n, m, start, end;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int a, b;
double p;
scanf("%d%d%lf", &a, &b, &p);
addEdge(a, b, p);
addEdge(b, a, p);
}
scanf("%d%d", &start, &end);
double ans = maxProbability(n, NULL, 0, NULL, NULL, start, end);
printf("%.8lf\n", ans);
return 0;
}
```
以上代码中使用了优先队列(或堆)来存储每个节点及其当前的最大概率,可以参考上面的解释。同时,为了方便输入数据,我们将原来的输入格式进行了改变,具体格式见代码中的注释。
阅读全文